diff --git a/components/analytics-mgt/grafana-mgt/io.entgra.device.mgt.core.analytics.mgt.grafana.proxy.api/pom.xml b/components/analytics-mgt/grafana-mgt/io.entgra.device.mgt.core.analytics.mgt.grafana.proxy.api/pom.xml
index 3c71621c82..b5c5bd3ac2 100644
--- a/components/analytics-mgt/grafana-mgt/io.entgra.device.mgt.core.analytics.mgt.grafana.proxy.api/pom.xml
+++ b/components/analytics-mgt/grafana-mgt/io.entgra.device.mgt.core.analytics.mgt.grafana.proxy.api/pom.xml
@@ -22,7 +22,7 @@
io.entgra.device.mgt.core
grafana-mgt
- 5.2.1-SNAPSHOT
+ 5.2.4-SNAPSHOT
../pom.xml
diff --git a/components/analytics-mgt/grafana-mgt/io.entgra.device.mgt.core.analytics.mgt.grafana.proxy.common/pom.xml b/components/analytics-mgt/grafana-mgt/io.entgra.device.mgt.core.analytics.mgt.grafana.proxy.common/pom.xml
index e5bc7fd35e..b2a6031989 100644
--- a/components/analytics-mgt/grafana-mgt/io.entgra.device.mgt.core.analytics.mgt.grafana.proxy.common/pom.xml
+++ b/components/analytics-mgt/grafana-mgt/io.entgra.device.mgt.core.analytics.mgt.grafana.proxy.common/pom.xml
@@ -22,7 +22,7 @@
io.entgra.device.mgt.core
grafana-mgt
- 5.2.1-SNAPSHOT
+ 5.2.4-SNAPSHOT
../pom.xml
diff --git a/components/analytics-mgt/grafana-mgt/io.entgra.device.mgt.core.analytics.mgt.grafana.proxy.core/pom.xml b/components/analytics-mgt/grafana-mgt/io.entgra.device.mgt.core.analytics.mgt.grafana.proxy.core/pom.xml
index ca9c0efc6a..4199ff7273 100644
--- a/components/analytics-mgt/grafana-mgt/io.entgra.device.mgt.core.analytics.mgt.grafana.proxy.core/pom.xml
+++ b/components/analytics-mgt/grafana-mgt/io.entgra.device.mgt.core.analytics.mgt.grafana.proxy.core/pom.xml
@@ -22,7 +22,7 @@
io.entgra.device.mgt.core
grafana-mgt
- 5.2.1-SNAPSHOT
+ 5.2.4-SNAPSHOT
../pom.xml
diff --git a/components/analytics-mgt/grafana-mgt/pom.xml b/components/analytics-mgt/grafana-mgt/pom.xml
index e172ba30c9..456834371f 100644
--- a/components/analytics-mgt/grafana-mgt/pom.xml
+++ b/components/analytics-mgt/grafana-mgt/pom.xml
@@ -22,7 +22,7 @@
io.entgra.device.mgt.core
analytics-mgt
- 5.2.1-SNAPSHOT
+ 5.2.4-SNAPSHOT
../pom.xml
diff --git a/components/analytics-mgt/pom.xml b/components/analytics-mgt/pom.xml
index 9d8d7f5128..7de259bada 100644
--- a/components/analytics-mgt/pom.xml
+++ b/components/analytics-mgt/pom.xml
@@ -21,7 +21,7 @@
io.entgra.device.mgt.core.parent
io.entgra.device.mgt.core
- 5.2.1-SNAPSHOT
+ 5.2.4-SNAPSHOT
../../pom.xml
diff --git a/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.analytics.extension/pom.xml b/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.analytics.extension/pom.xml
index 6b3d0e79c2..866cb6ce57 100644
--- a/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.analytics.extension/pom.xml
+++ b/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.analytics.extension/pom.xml
@@ -20,7 +20,7 @@
apimgt-extensions
io.entgra.device.mgt.core
- 5.2.1-SNAPSHOT
+ 5.2.4-SNAPSHOT
4.0.0
diff --git a/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.annotations/pom.xml b/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.annotations/pom.xml
index 471cf1a73f..fba5591029 100644
--- a/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.annotations/pom.xml
+++ b/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.annotations/pom.xml
@@ -22,7 +22,7 @@
apimgt-extensions
io.entgra.device.mgt.core
- 5.2.1-SNAPSHOT
+ 5.2.4-SNAPSHOT
../pom.xml
diff --git a/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.application.extension.api/pom.xml b/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.application.extension.api/pom.xml
index 58a44b4978..4be52ce94d 100644
--- a/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.application.extension.api/pom.xml
+++ b/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.application.extension.api/pom.xml
@@ -21,7 +21,7 @@
apimgt-extensions
io.entgra.device.mgt.core
- 5.2.1-SNAPSHOT
+ 5.2.4-SNAPSHOT
../pom.xml
diff --git a/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.application.extension/pom.xml b/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.application.extension/pom.xml
index 0f44f5812a..fdf9c2dd68 100644
--- a/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.application.extension/pom.xml
+++ b/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.application.extension/pom.xml
@@ -22,7 +22,7 @@
apimgt-extensions
io.entgra.device.mgt.core
- 5.2.1-SNAPSHOT
+ 5.2.4-SNAPSHOT
../pom.xml
diff --git a/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.extension.rest.api/pom.xml b/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.extension.rest.api/pom.xml
index 5f4007a21a..7f6cf515e0 100644
--- a/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.extension.rest.api/pom.xml
+++ b/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.extension.rest.api/pom.xml
@@ -22,7 +22,7 @@
apimgt-extensions
io.entgra.device.mgt.core
- 5.2.1-SNAPSHOT
+ 5.2.4-SNAPSHOT
../pom.xml
diff --git a/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.keymgt.extension.api/pom.xml b/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.keymgt.extension.api/pom.xml
index b497e98b2f..14b4f62707 100644
--- a/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.keymgt.extension.api/pom.xml
+++ b/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.keymgt.extension.api/pom.xml
@@ -21,7 +21,7 @@
apimgt-extensions
io.entgra.device.mgt.core
- 5.2.1-SNAPSHOT
+ 5.2.4-SNAPSHOT
4.0.0
diff --git a/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.keymgt.extension/pom.xml b/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.keymgt.extension/pom.xml
index e9e2ba62c2..25c942800f 100644
--- a/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.keymgt.extension/pom.xml
+++ b/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.keymgt.extension/pom.xml
@@ -21,7 +21,7 @@
apimgt-extensions
io.entgra.device.mgt.core
- 5.2.1-SNAPSHOT
+ 5.2.4-SNAPSHOT
../pom.xml
diff --git a/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.webapp.publisher/pom.xml b/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.webapp.publisher/pom.xml
index 8999e4a6b8..d5663f5433 100644
--- a/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.webapp.publisher/pom.xml
+++ b/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.webapp.publisher/pom.xml
@@ -22,7 +22,7 @@
apimgt-extensions
io.entgra.device.mgt.core
- 5.2.1-SNAPSHOT
+ 5.2.4-SNAPSHOT
../pom.xml
diff --git a/components/apimgt-extensions/pom.xml b/components/apimgt-extensions/pom.xml
index 81121b08cb..6bf36e1e82 100644
--- a/components/apimgt-extensions/pom.xml
+++ b/components/apimgt-extensions/pom.xml
@@ -22,7 +22,7 @@
io.entgra.device.mgt.core
io.entgra.device.mgt.core.parent
- 5.2.1-SNAPSHOT
+ 5.2.4-SNAPSHOT
../../pom.xml
diff --git a/components/application-mgt/io.entgra.device.mgt.core.application.mgt.common/pom.xml b/components/application-mgt/io.entgra.device.mgt.core.application.mgt.common/pom.xml
index 3f87d0369a..482bc93ae9 100644
--- a/components/application-mgt/io.entgra.device.mgt.core.application.mgt.common/pom.xml
+++ b/components/application-mgt/io.entgra.device.mgt.core.application.mgt.common/pom.xml
@@ -21,7 +21,7 @@
io.entgra.device.mgt.core
application-mgt
- 5.2.1-SNAPSHOT
+ 5.2.4-SNAPSHOT
../pom.xml
diff --git a/components/application-mgt/io.entgra.device.mgt.core.application.mgt.common/src/main/java/io/entgra/device/mgt/core/application/mgt/common/CategorizedSubscriptionResult.java b/components/application-mgt/io.entgra.device.mgt.core.application.mgt.common/src/main/java/io/entgra/device/mgt/core/application/mgt/common/CategorizedSubscriptionResult.java
index 18da5a7736..e685284b77 100644
--- a/components/application-mgt/io.entgra.device.mgt.core.application.mgt.common/src/main/java/io/entgra/device/mgt/core/application/mgt/common/CategorizedSubscriptionResult.java
+++ b/components/application-mgt/io.entgra.device.mgt.core.application.mgt.common/src/main/java/io/entgra/device/mgt/core/application/mgt/common/CategorizedSubscriptionResult.java
@@ -23,10 +23,15 @@ import java.util.List;
public class CategorizedSubscriptionResult {
private List installedDevices;
+ private int installedDevicesCount;
private List pendingDevices;
+ private int pendingDevicesCount;
private List errorDevices;
+ private int errorDevicesCount;
private List newDevices;
+ private int newDevicesCount;
private List subscribedDevices;
+ private int subscribedDevicesCount;
public CategorizedSubscriptionResult(List installedDevices,
List pendingDevices,
@@ -61,6 +66,48 @@ public class CategorizedSubscriptionResult {
this.subscribedDevices = subscribedDevices;
}
+ public CategorizedSubscriptionResult(List installedDevices,
+ List pendingDevices,
+ List errorDevices,
+ List newDevices,
+ int installedDevicesCount,
+ int pendingDevicesCount,
+ int errorDevicesCount,
+ int newDevicesCount
+ ) {
+ this.installedDevices = installedDevices;
+ this.pendingDevices = pendingDevices;
+ this.errorDevices = errorDevices;
+ this.newDevices = newDevices;
+ this.subscribedDevices = null;
+ this.installedDevicesCount = installedDevicesCount;
+ this.pendingDevicesCount = pendingDevicesCount;
+ this.errorDevicesCount = errorDevicesCount;
+ this.newDevicesCount = newDevicesCount;
+ this.subscribedDevicesCount = 0;
+ }
+
+ public CategorizedSubscriptionResult(List installedDevices,
+ List pendingDevices,
+ List errorDevices,
+ List newDevices,
+ List subscribedDevices, int installedDevicesCount,
+ int pendingDevicesCount,
+ int errorDevicesCount,
+ int newDevicesCount,
+ int subscribedDevicesCount) {
+ this.installedDevices = installedDevices;
+ this.pendingDevices = pendingDevices;
+ this.errorDevices = errorDevices;
+ this.newDevices = newDevices;
+ this.subscribedDevices = subscribedDevices;
+ this.installedDevicesCount = installedDevicesCount;
+ this.pendingDevicesCount = pendingDevicesCount;
+ this.errorDevicesCount = errorDevicesCount;
+ this.newDevicesCount = newDevicesCount;
+ this.subscribedDevicesCount = subscribedDevicesCount;
+ }
+
public CategorizedSubscriptionResult(List devices, String tabActionStatus) {
switch (tabActionStatus) {
case "COMPLETED":
@@ -127,4 +174,44 @@ public class CategorizedSubscriptionResult {
public void setSubscribedDevices(List subscribedDevices) {
this.subscribedDevices = subscribedDevices;
}
+
+ public int getInstalledDevicesCount() {
+ return installedDevicesCount;
+ }
+
+ public void setInstalledDevicesCount(int installedDevicesCount) {
+ this.installedDevicesCount = installedDevicesCount;
+ }
+
+ public int getPendingDevicesCount() {
+ return pendingDevicesCount;
+ }
+
+ public void setPendingDevicesCount(int pendingDevicesCount) {
+ this.pendingDevicesCount = pendingDevicesCount;
+ }
+
+ public int getErrorDevicesCount() {
+ return errorDevicesCount;
+ }
+
+ public void setErrorDevicesCount(int errorDevicesCount) {
+ this.errorDevicesCount = errorDevicesCount;
+ }
+
+ public int getNewDevicesCount() {
+ return newDevicesCount;
+ }
+
+ public void setNewDevicesCount(int newDevicesCount) {
+ this.newDevicesCount = newDevicesCount;
+ }
+
+ public int getSubscribedDevicesCount() {
+ return subscribedDevicesCount;
+ }
+
+ public void setSubscribedDevicesCount(int subscribedDevicesCount) {
+ this.subscribedDevicesCount = subscribedDevicesCount;
+ }
}
diff --git a/components/application-mgt/io.entgra.device.mgt.core.application.mgt.common/src/main/java/io/entgra/device/mgt/core/application/mgt/common/DeviceSubscription.java b/components/application-mgt/io.entgra.device.mgt.core.application.mgt.common/src/main/java/io/entgra/device/mgt/core/application/mgt/common/DeviceSubscription.java
new file mode 100644
index 0000000000..16e1d7553f
--- /dev/null
+++ b/components/application-mgt/io.entgra.device.mgt.core.application.mgt.common/src/main/java/io/entgra/device/mgt/core/application/mgt/common/DeviceSubscription.java
@@ -0,0 +1,115 @@
+/*
+ * Copyright (c) 2018 - 2024, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved.
+ *
+ * Entgra (Pvt) Ltd. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package io.entgra.device.mgt.core.application.mgt.common;
+
+import java.sql.Timestamp;
+
+public class DeviceSubscription {
+ private int deviceId;
+ private int subscriptionId;
+ private String deviceName;
+ private String deviceIdentifier;
+ private String deviceStatus;
+ private String deviceOwner;
+ private String deviceType;
+ private String ownershipType;
+ private Timestamp dateOfLastUpdate;
+ private SubscriptionData subscriptionData;
+
+ public int getSubscriptionId() {
+ return subscriptionId;
+ }
+
+ public void setSubscriptionId(int subscriptionId) {
+ this.subscriptionId = subscriptionId;
+ }
+
+ public int getDeviceId() {
+ return deviceId;
+ }
+
+ public void setDeviceId(int deviceId) {
+ this.deviceId = deviceId;
+ }
+
+ public String getDeviceName() {
+ return deviceName;
+ }
+
+ public void setDeviceName(String deviceName) {
+ this.deviceName = deviceName;
+ }
+
+ public String getDeviceIdentifier() {
+ return deviceIdentifier;
+ }
+
+ public void setDeviceIdentifier(String deviceIdentifier) {
+ this.deviceIdentifier = deviceIdentifier;
+ }
+
+ public String getDeviceStatus() {
+ return deviceStatus;
+ }
+
+ public void setDeviceStatus(String deviceStatus) {
+ this.deviceStatus = deviceStatus;
+ }
+
+ public String getDeviceOwner() {
+ return deviceOwner;
+ }
+
+ public void setDeviceOwner(String deviceOwner) {
+ this.deviceOwner = deviceOwner;
+ }
+
+ public String getDeviceType() {
+ return deviceType;
+ }
+
+ public void setDeviceType(String deviceType) {
+ this.deviceType = deviceType;
+ }
+
+ public String getOwnershipType() {
+ return ownershipType;
+ }
+
+ public void setOwnershipType(String ownershipType) {
+ this.ownershipType = ownershipType;
+ }
+
+ public Timestamp getDateOfLastUpdate() {
+ return dateOfLastUpdate;
+ }
+
+ public void setDateOfLastUpdate(Timestamp dateOfLastUpdate) {
+ this.dateOfLastUpdate = dateOfLastUpdate;
+ }
+
+ public SubscriptionData getSubscriptionData() {
+ return subscriptionData;
+ }
+
+ public void setSubscriptionData(SubscriptionData subscriptionData) {
+ this.subscriptionData = subscriptionData;
+ }
+}
diff --git a/components/application-mgt/io.entgra.device.mgt.core.application.mgt.common/src/main/java/io/entgra/device/mgt/core/application/mgt/common/DeviceSubscriptionFilterCriteria.java b/components/application-mgt/io.entgra.device.mgt.core.application.mgt.common/src/main/java/io/entgra/device/mgt/core/application/mgt/common/DeviceSubscriptionFilterCriteria.java
new file mode 100644
index 0000000000..298a5221eb
--- /dev/null
+++ b/components/application-mgt/io.entgra.device.mgt.core.application.mgt.common/src/main/java/io/entgra/device/mgt/core/application/mgt/common/DeviceSubscriptionFilterCriteria.java
@@ -0,0 +1,68 @@
+/*
+ * Copyright (c) 2018 - 2024, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved.
+ *
+ * Entgra (Pvt) Ltd. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package io.entgra.device.mgt.core.application.mgt.common;
+
+public class DeviceSubscriptionFilterCriteria {
+ private String name;
+ private String owner;
+ private String deviceStatus;
+ private String filteringDeviceSubscriptionStatus; // COMPLETE, PENDING ...
+ private String triggeredBy;
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getOwner() {
+ return owner;
+ }
+
+ public void setOwner(String owner) {
+ this.owner = owner;
+ }
+
+ public String getDeviceStatus() {
+ return deviceStatus;
+ }
+
+ public void setDeviceStatus(String deviceStatus) {
+ this.deviceStatus = deviceStatus;
+ }
+
+ public String getFilteringDeviceSubscriptionStatus() {
+ return filteringDeviceSubscriptionStatus;
+ }
+
+ public void setFilteringDeviceSubscriptionStatus(String filteringDeviceSubscriptionStatus) {
+ this.filteringDeviceSubscriptionStatus = filteringDeviceSubscriptionStatus;
+ }
+
+ public String getTriggeredBy() {
+ return triggeredBy;
+ }
+
+ public void setTriggeredBy(String triggeredBy) {
+ this.triggeredBy = triggeredBy;
+ }
+}
diff --git a/components/application-mgt/io.entgra.device.mgt.core.application.mgt.common/src/main/java/io/entgra/device/mgt/core/application/mgt/common/SubscriptionData.java b/components/application-mgt/io.entgra.device.mgt.core.application.mgt.common/src/main/java/io/entgra/device/mgt/core/application/mgt/common/SubscriptionData.java
new file mode 100644
index 0000000000..cef9a12508
--- /dev/null
+++ b/components/application-mgt/io.entgra.device.mgt.core.application.mgt.common/src/main/java/io/entgra/device/mgt/core/application/mgt/common/SubscriptionData.java
@@ -0,0 +1,70 @@
+/*
+ * Copyright (c) 2018 - 2024, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved.
+ *
+ * Entgra (Pvt) Ltd. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package io.entgra.device.mgt.core.application.mgt.common;
+
+import java.sql.Timestamp;
+
+public class SubscriptionData {
+ private String deviceSubscriptionStatus;
+ private String triggeredBy;
+ private String subscriptionType;
+ private Timestamp triggeredAt;
+ private int subscriptionId;
+
+ public String getDeviceSubscriptionStatus() {
+ return deviceSubscriptionStatus;
+ }
+
+ public void setDeviceSubscriptionStatus(String deviceSubscriptionStatus) {
+ this.deviceSubscriptionStatus = deviceSubscriptionStatus;
+ }
+
+ public String getTriggeredBy() {
+ return triggeredBy;
+ }
+
+ public void setTriggeredBy(String triggeredBy) {
+ this.triggeredBy = triggeredBy;
+ }
+
+ public String getSubscriptionType() {
+ return subscriptionType;
+ }
+
+ public void setSubscriptionType(String subscriptionType) {
+ this.subscriptionType = subscriptionType;
+ }
+
+ public Timestamp getTriggeredAt() {
+ return triggeredAt;
+ }
+
+ public void setTriggeredAt(Timestamp triggeredAt) {
+ this.triggeredAt = triggeredAt;
+ }
+
+ public int getSubscriptionId() {
+ return subscriptionId;
+ }
+
+ public void setSubscriptionId(int subscriptionId) {
+ this.subscriptionId = subscriptionId;
+ }
+}
diff --git a/components/application-mgt/io.entgra.device.mgt.core.application.mgt.common/src/main/java/io/entgra/device/mgt/core/application/mgt/common/SubscriptionEntity.java b/components/application-mgt/io.entgra.device.mgt.core.application.mgt.common/src/main/java/io/entgra/device/mgt/core/application/mgt/common/SubscriptionEntity.java
new file mode 100644
index 0000000000..40c1b2f4a7
--- /dev/null
+++ b/components/application-mgt/io.entgra.device.mgt.core.application.mgt.common/src/main/java/io/entgra/device/mgt/core/application/mgt/common/SubscriptionEntity.java
@@ -0,0 +1,88 @@
+/*
+ * Copyright (c) 2018 - 2024, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved.
+ *
+ * Entgra (Pvt) Ltd. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package io.entgra.device.mgt.core.application.mgt.common;
+
+import java.sql.Timestamp;
+
+public class SubscriptionEntity {
+ private String identity;
+ private String subscribedBy;
+ private Timestamp subscribedTimestamp;
+ private boolean unsubscribed;
+ private String unsubscribedBy;
+ private Timestamp unsubscribedTimestamp;
+ private int applicationReleaseId;
+
+ public String getIdentity() {
+ return identity;
+ }
+
+ public void setIdentity(String identity) {
+ this.identity = identity;
+ }
+
+ public String getSubscribedBy() {
+ return subscribedBy;
+ }
+
+ public void setSubscribedBy(String subscribedBy) {
+ this.subscribedBy = subscribedBy;
+ }
+
+ public Timestamp getSubscribedTimestamp() {
+ return subscribedTimestamp;
+ }
+
+ public void setSubscribedTimestamp(Timestamp subscribedTimestamp) {
+ this.subscribedTimestamp = subscribedTimestamp;
+ }
+
+ public boolean getUnsubscribed() {
+ return unsubscribed;
+ }
+
+ public void setUnsubscribed(boolean unsubscribed) {
+ this.unsubscribed = unsubscribed;
+ }
+
+ public String getUnsubscribedBy() {
+ return unsubscribedBy;
+ }
+
+ public void setUnsubscribedBy(String unsubscribedBy) {
+ this.unsubscribedBy = unsubscribedBy;
+ }
+
+ public Timestamp getUnsubscribedTimestamp() {
+ return unsubscribedTimestamp;
+ }
+
+ public void setUnsubscribedTimestamp(Timestamp unsubscribedTimestamp) {
+ this.unsubscribedTimestamp = unsubscribedTimestamp;
+ }
+
+ public int getApplicationReleaseId() {
+ return applicationReleaseId;
+ }
+
+ public void setApplicationReleaseId(int applicationReleaseId) {
+ this.applicationReleaseId = applicationReleaseId;
+ }
+}
diff --git a/components/application-mgt/io.entgra.device.mgt.core.application.mgt.common/src/main/java/io/entgra/device/mgt/core/application/mgt/common/SubscriptionInfo.java b/components/application-mgt/io.entgra.device.mgt.core.application.mgt.common/src/main/java/io/entgra/device/mgt/core/application/mgt/common/SubscriptionInfo.java
new file mode 100644
index 0000000000..6af03aa61a
--- /dev/null
+++ b/components/application-mgt/io.entgra.device.mgt.core.application.mgt.common/src/main/java/io/entgra/device/mgt/core/application/mgt/common/SubscriptionInfo.java
@@ -0,0 +1,77 @@
+/*
+ * Copyright (c) 2018 - 2024, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved.
+ *
+ * Entgra (Pvt) Ltd. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package io.entgra.device.mgt.core.application.mgt.common;
+
+public class SubscriptionInfo {
+ private String applicationUUID;
+ private String subscriptionType;
+ private String deviceSubscriptionStatus;
+ private String identifier;
+ private String subscriptionStatus;
+ private DeviceSubscriptionFilterCriteria deviceSubscriptionFilterCriteria;
+
+ public String getApplicationUUID() {
+ return applicationUUID;
+ }
+
+ public void setApplicationUUID(String applicationUUID) {
+ this.applicationUUID = applicationUUID;
+ }
+
+ public String getSubscriptionType() {
+ return subscriptionType;
+ }
+
+ public void setSubscriptionType(String subscriptionType) {
+ this.subscriptionType = subscriptionType;
+ }
+
+ public String getDeviceSubscriptionStatus() {
+ return deviceSubscriptionStatus;
+ }
+
+ public void setDeviceSubscriptionStatus(String deviceSubscriptionStatus) {
+ this.deviceSubscriptionStatus = deviceSubscriptionStatus;
+ }
+
+ public String getIdentifier() {
+ return identifier;
+ }
+
+ public void setIdentifier(String identifier) {
+ this.identifier = identifier;
+ }
+
+ public String getSubscriptionStatus() {
+ return subscriptionStatus;
+ }
+
+ public void setSubscriptionStatus(String subscriptionStatus) {
+ this.subscriptionStatus = subscriptionStatus;
+ }
+
+ public DeviceSubscriptionFilterCriteria getDeviceSubscriptionFilterCriteria() {
+ return deviceSubscriptionFilterCriteria;
+ }
+
+ public void setDeviceSubscriptionFilterCriteria(DeviceSubscriptionFilterCriteria deviceSubscriptionFilterCriteria) {
+ this.deviceSubscriptionFilterCriteria = deviceSubscriptionFilterCriteria;
+ }
+}
diff --git a/components/application-mgt/io.entgra.device.mgt.core.application.mgt.common/src/main/java/io/entgra/device/mgt/core/application/mgt/common/SubscriptionMetadata.java b/components/application-mgt/io.entgra.device.mgt.core.application.mgt.common/src/main/java/io/entgra/device/mgt/core/application/mgt/common/SubscriptionMetadata.java
new file mode 100644
index 0000000000..bd487dfea4
--- /dev/null
+++ b/components/application-mgt/io.entgra.device.mgt.core.application.mgt.common/src/main/java/io/entgra/device/mgt/core/application/mgt/common/SubscriptionMetadata.java
@@ -0,0 +1,69 @@
+/*
+ * Copyright (c) 2018 - 2024, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved.
+ *
+ * Entgra (Pvt) Ltd. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package io.entgra.device.mgt.core.application.mgt.common;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class SubscriptionMetadata {
+ public static final String SUBSCRIPTION_STATUS_UNSUBSCRIBED = "unsubscribed";
+ public static final class DeviceSubscriptionStatus {
+ public static final String NEW = "NEW";
+ public static final String PENDING = "PENDING";
+ public static final String COMPLETED = "COMPLETED";
+ public static final String ERROR = "ERROR";
+ public static final String INVALID = "INVALID";
+ public static final String UNAUTHORIZED = "UNAUTHORIZED";
+ public static final String IN_PROGRESS = "IN_PROGRESS";
+ public static final String REPEATED = "REPEATED";
+ }
+
+ public static final class SubscriptionTypes {
+ public static final String ROLE = "role";
+ public static final String DEVICE = "device";
+ public static final String GROUP = "group";
+ public static final String USER = "user";
+ }
+
+ public static final class DBSubscriptionStatus {
+ public static final List COMPLETED_STATUS_LIST =
+ Collections.singletonList(DeviceSubscriptionStatus.COMPLETED);
+ public static final List ERROR_STATUS_LIST =
+ Arrays.asList(DeviceSubscriptionStatus.ERROR, DeviceSubscriptionStatus.INVALID, DeviceSubscriptionStatus.UNAUTHORIZED);
+ public static final List PENDING_STATUS_LIST =
+ Arrays.asList(DeviceSubscriptionStatus.PENDING, DeviceSubscriptionStatus.IN_PROGRESS, DeviceSubscriptionStatus.REPEATED);
+ }
+
+ public static Map> deviceSubscriptionStatusToDBSubscriptionStatusMap;
+ static {
+ Map> statusMap = new HashMap<>();
+ statusMap.put(DeviceSubscriptionStatus.COMPLETED, DBSubscriptionStatus.COMPLETED_STATUS_LIST);
+ statusMap.put(DeviceSubscriptionStatus.PENDING, DBSubscriptionStatus.PENDING_STATUS_LIST);
+ statusMap.put(DeviceSubscriptionStatus.IN_PROGRESS, Collections.singletonList(DeviceSubscriptionStatus.IN_PROGRESS));
+ statusMap.put(DeviceSubscriptionStatus.REPEATED, Collections.singletonList(DeviceSubscriptionStatus.REPEATED));
+ statusMap.put(DeviceSubscriptionStatus.ERROR, DBSubscriptionStatus.ERROR_STATUS_LIST);
+ statusMap.put(DeviceSubscriptionStatus.INVALID,Collections.singletonList(DeviceSubscriptionStatus.INVALID));
+ statusMap.put(DeviceSubscriptionStatus.UNAUTHORIZED,Collections.singletonList(DeviceSubscriptionStatus.UNAUTHORIZED));
+ deviceSubscriptionStatusToDBSubscriptionStatusMap = Collections.unmodifiableMap(statusMap);
+ }
+}
diff --git a/components/application-mgt/io.entgra.device.mgt.core.application.mgt.common/src/main/java/io/entgra/device/mgt/core/application/mgt/common/SubscriptionResponse.java b/components/application-mgt/io.entgra.device.mgt.core.application.mgt.common/src/main/java/io/entgra/device/mgt/core/application/mgt/common/SubscriptionResponse.java
new file mode 100644
index 0000000000..aeaeba70be
--- /dev/null
+++ b/components/application-mgt/io.entgra.device.mgt.core.application.mgt.common/src/main/java/io/entgra/device/mgt/core/application/mgt/common/SubscriptionResponse.java
@@ -0,0 +1,63 @@
+/*
+ * Copyright (c) 2018 - 2024, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved.
+ *
+ * Entgra (Pvt) Ltd. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package io.entgra.device.mgt.core.application.mgt.common;
+
+import java.util.List;
+
+public class SubscriptionResponse {
+ private String applicationUUID;
+ private int count;
+ private List> data;
+
+ public SubscriptionResponse(String applicationUUID, int count, List> data) {
+ this.applicationUUID = applicationUUID;
+ this.count = count;
+ this.data = data;
+ }
+
+ public SubscriptionResponse(String applicationUUID, List> data) {
+ this.applicationUUID = applicationUUID;
+ this.data = data;
+ }
+
+ public String getApplicationUUID() {
+ return applicationUUID;
+ }
+
+ public void setApplicationUUID(String applicationUUID) {
+ this.applicationUUID = applicationUUID;
+ }
+
+ public int getCount() {
+ return count;
+ }
+
+ public void setCount(int count) {
+ this.count = count;
+ }
+
+ public List> getData() {
+ return data;
+ }
+
+ public void setData(List> data) {
+ this.data = data;
+ }
+}
diff --git a/components/application-mgt/io.entgra.device.mgt.core.application.mgt.common/src/main/java/io/entgra/device/mgt/core/application/mgt/common/SubscriptionStatistics.java b/components/application-mgt/io.entgra.device.mgt.core.application.mgt.common/src/main/java/io/entgra/device/mgt/core/application/mgt/common/SubscriptionStatistics.java
new file mode 100644
index 0000000000..80a10e98c5
--- /dev/null
+++ b/components/application-mgt/io.entgra.device.mgt.core.application.mgt.common/src/main/java/io/entgra/device/mgt/core/application/mgt/common/SubscriptionStatistics.java
@@ -0,0 +1,68 @@
+/*
+ * Copyright (c) 2018 - 2024, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved.
+ *
+ * Entgra (Pvt) Ltd. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package io.entgra.device.mgt.core.application.mgt.common;
+
+public class SubscriptionStatistics {
+ private float completedPercentage;
+ private float failedPercentage;
+ private float pendingPercentage;
+ private float newDevicesPercentage;
+
+ public SubscriptionStatistics() {}
+ public SubscriptionStatistics(float completedPercentage, float failedPercentage, float pendingPercentage,
+ float newDevicesPercentage) {
+ this.completedPercentage = completedPercentage;
+ this.failedPercentage = failedPercentage;
+ this.pendingPercentage = pendingPercentage;
+ this.newDevicesPercentage = newDevicesPercentage;
+ }
+
+ public float getCompletedPercentage() {
+ return completedPercentage;
+ }
+
+ public void setCompletedPercentage(float completedPercentage) {
+ this.completedPercentage = completedPercentage;
+ }
+
+ public float getFailedPercentage() {
+ return failedPercentage;
+ }
+
+ public void setFailedPercentage(float failedPercentage) {
+ this.failedPercentage = failedPercentage;
+ }
+
+ public float getPendingPercentage() {
+ return pendingPercentage;
+ }
+
+ public void setPendingPercentage(float pendingPercentage) {
+ this.pendingPercentage = pendingPercentage;
+ }
+
+ public float getNewDevicesPercentage() {
+ return newDevicesPercentage;
+ }
+
+ public void setNewDevicesPercentage(float newDevicesPercentage) {
+ this.newDevicesPercentage = newDevicesPercentage;
+ }
+}
diff --git a/components/application-mgt/io.entgra.device.mgt.core.application.mgt.common/src/main/java/io/entgra/device/mgt/core/application/mgt/common/dto/DeviceSubscriptionDTO.java b/components/application-mgt/io.entgra.device.mgt.core.application.mgt.common/src/main/java/io/entgra/device/mgt/core/application/mgt/common/dto/DeviceSubscriptionDTO.java
index 3306256b19..aa4f221ca3 100644
--- a/components/application-mgt/io.entgra.device.mgt.core.application.mgt.common/src/main/java/io/entgra/device/mgt/core/application/mgt/common/dto/DeviceSubscriptionDTO.java
+++ b/components/application-mgt/io.entgra.device.mgt.core.application.mgt.common/src/main/java/io/entgra/device/mgt/core/application/mgt/common/dto/DeviceSubscriptionDTO.java
@@ -19,6 +19,7 @@
package io.entgra.device.mgt.core.application.mgt.common.dto;
import java.sql.Timestamp;
+import java.util.Objects;
public class DeviceSubscriptionDTO {
@@ -34,6 +35,19 @@ public class DeviceSubscriptionDTO {
private int appReleaseId;
private String appUuid;
+ public DeviceSubscriptionDTO() {
+
+ }
+
+ public DeviceSubscriptionDTO(int deviceId) {
+ this.deviceId = deviceId;
+ }
+
+ public DeviceSubscriptionDTO(int deviceId, String status) {
+ this.deviceId = deviceId;
+ this.status = status;
+ }
+
public int getId() {
return id;
}
@@ -121,4 +135,17 @@ public class DeviceSubscriptionDTO {
public void setAppUuid(String appUuid) {
this.appUuid = appUuid;
}
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ DeviceSubscriptionDTO that = (DeviceSubscriptionDTO) o;
+ return deviceId == that.deviceId;
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(deviceId);
+ }
}
diff --git a/components/application-mgt/io.entgra.device.mgt.core.application.mgt.common/src/main/java/io/entgra/device/mgt/core/application/mgt/common/dto/SubscriptionStatisticDTO.java b/components/application-mgt/io.entgra.device.mgt.core.application.mgt.common/src/main/java/io/entgra/device/mgt/core/application/mgt/common/dto/SubscriptionStatisticDTO.java
new file mode 100644
index 0000000000..c50e47a5ac
--- /dev/null
+++ b/components/application-mgt/io.entgra.device.mgt.core.application.mgt.common/src/main/java/io/entgra/device/mgt/core/application/mgt/common/dto/SubscriptionStatisticDTO.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright (c) 2018 - 2024, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved.
+ *
+ * Entgra (Pvt) Ltd. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package io.entgra.device.mgt.core.application.mgt.common.dto;
+
+public class SubscriptionStatisticDTO {
+ private int completedDeviceCount = 0;
+ private int pendingDevicesCount = 0;
+ private int failedDevicesCount = 0;
+
+ public void addToComplete(int count) {
+ completedDeviceCount += count;
+ }
+
+ public void addToPending(int count) {
+ pendingDevicesCount += count;
+ }
+
+ public void addToFailed(int count) {
+ failedDevicesCount += count ;
+ }
+
+ public int getCompletedDeviceCount() {
+ return completedDeviceCount;
+ }
+
+ public void setCompletedDeviceCount(int completedDeviceCount) {
+ this.completedDeviceCount = completedDeviceCount;
+ }
+
+ public int getPendingDevicesCount() {
+ return pendingDevicesCount;
+ }
+
+ public void setPendingDevicesCount(int pendingDevicesCount) {
+ this.pendingDevicesCount = pendingDevicesCount;
+ }
+
+ public int getFailedDevicesCount() {
+ return failedDevicesCount;
+ }
+
+ public void setFailedDevicesCount(int failedDevicesCount) {
+ this.failedDevicesCount = failedDevicesCount;
+ }
+}
diff --git a/components/application-mgt/io.entgra.device.mgt.core.application.mgt.common/src/main/java/io/entgra/device/mgt/core/application/mgt/common/services/SubscriptionManager.java b/components/application-mgt/io.entgra.device.mgt.core.application.mgt.common/src/main/java/io/entgra/device/mgt/core/application/mgt/common/services/SubscriptionManager.java
index c8ca40813a..1e70f1b9d6 100644
--- a/components/application-mgt/io.entgra.device.mgt.core.application.mgt.common/src/main/java/io/entgra/device/mgt/core/application/mgt/common/services/SubscriptionManager.java
+++ b/components/application-mgt/io.entgra.device.mgt.core.application.mgt.common/src/main/java/io/entgra/device/mgt/core/application/mgt/common/services/SubscriptionManager.java
@@ -19,9 +19,16 @@ package io.entgra.device.mgt.core.application.mgt.common.services;
import io.entgra.device.mgt.core.application.mgt.common.ApplicationInstallResponse;
import io.entgra.device.mgt.core.application.mgt.common.CategorizedSubscriptionResult;
+import io.entgra.device.mgt.core.application.mgt.common.DeviceSubscription;
+import io.entgra.device.mgt.core.application.mgt.common.DeviceSubscriptionData;
import io.entgra.device.mgt.core.application.mgt.common.ExecutionStatus;
+import io.entgra.device.mgt.core.application.mgt.common.SubscriptionEntity;
+import io.entgra.device.mgt.core.application.mgt.common.SubscriptionInfo;
+import io.entgra.device.mgt.core.application.mgt.common.SubscriptionResponse;
+import io.entgra.device.mgt.core.application.mgt.common.SubscriptionStatistics;
import io.entgra.device.mgt.core.application.mgt.common.SubscriptionType;
import io.entgra.device.mgt.core.application.mgt.common.dto.CategorizedSubscriptionCountsDTO;
+import io.entgra.device.mgt.core.application.mgt.common.dto.DeviceSubscriptionDTO;
import io.entgra.device.mgt.core.application.mgt.common.dto.ScheduledSubscriptionDTO;
import io.entgra.device.mgt.core.application.mgt.common.dto.SubscriptionsDTO;
import io.entgra.device.mgt.core.application.mgt.common.dto.DeviceOperationDTO;
@@ -224,72 +231,34 @@ public interface SubscriptionManager {
Activity getOperationAppDetails(String id) throws SubscriptionManagementException;
/**
- * Retrieves the group details associated with a given app release UUID.
- *
- * @param uuid the UUID of the app release
- * @param subscriptionStatus the status of the subscription (subscribed or unsubscribed)
- * @param offset the offset for the data set
- * @param limit the limit for the data set
- * @return {@link SubscriptionsDTO} which contains the details of subscriptions.
- * @throws ApplicationManagementException if an error occurs while fetching the group details
- */
- public List getGroupsSubscriptionDetailsByUUID(String uuid, String subscriptionStatus,
- PaginationRequest request, int offset,
- int limit) throws ApplicationManagementException;
-
- /**
- * Retrieves the user details associated with a given app release UUID.
- *
- * @param uuid the UUID of the app release
- * @param subscriptionStatus the status of the subscription (subscribed or unsubscribed)
- * @param offset the offset for the data set
- * @param limit the limit for the data set
- * @return {@link SubscriptionsDTO} which contains the details of subscriptions.
- * @throws ApplicationManagementException if an error occurs while fetching the user details
- */
- List getUserSubscriptionsByUUID(String uuid, String subscriptionStatus, PaginationRequest request,
- int offset, int limit) throws ApplicationManagementException;
-
- /**
- * Retrieves the Role details associated with a given app release UUID.
- *
- * @param uuid the UUID of the app release
- * @param subscriptionStatus the status of the subscription (subscribed or unsubscribed)
- * @param offset the offset for the data set
- * @param limit the limit for the data set
- * @return {@link SubscriptionsDTO} which contains the details of subscriptions.
- * @throws ApplicationManagementException if an error occurs while fetching the role details
+ * Get subscription data describes by {@link SubscriptionInfo} entity
+ * @param subscriptionInfo {@link SubscriptionInfo}
+ * @param limit Limit value
+ * @param offset Offset value
+ * @return {@link SubscriptionResponse}
+ * @throws ApplicationManagementException Throws when error encountered while getting subscription data
*/
- List getRoleSubscriptionsByUUID(String uuid, String subscriptionStatus, PaginationRequest request,
- int offset, int limit) throws ApplicationManagementException;
+ SubscriptionResponse getSubscriptions(SubscriptionInfo subscriptionInfo, int limit, int offset)
+ throws ApplicationManagementException;
/**
- * Retrieves the Device Subscription details associated with a given app release UUID.
- *
- * @param uuid the UUID of the app release
- * @param subscriptionStatus the status of the subscription (subscribed or unsubscribed)
- * @param offset the offset for the data set
- * @param limit the limit for the data set
- * @return {@link DeviceSubscriptionResponseDTO} which contains the details of device subscriptions.
- * @throws ApplicationManagementException if an error occurs while fetching the device subscription details
+ * Get status based subscription data describes by {@link SubscriptionInfo} entity
+ * @param subscriptionInfo {@link SubscriptionInfo}
+ * @param limit Limit value
+ * @param offset Offset value
+ * @return {@link SubscriptionResponse}
+ * @throws ApplicationManagementException Throws when error encountered while getting subscription data
*/
- DeviceSubscriptionResponseDTO getDeviceSubscriptionsDetailsByUUID(String uuid, String subscriptionStatus,
- PaginationRequest request, int offset,
- int limit) throws ApplicationManagementException;
+ SubscriptionResponse getStatusBaseSubscriptions(SubscriptionInfo subscriptionInfo, int limit, int offset)
+ throws ApplicationManagementException;
/**
- * Retrieves the All Device details associated with a given app release UUID.
- *
- * @param uuid the UUID of the app release
- * @param subscriptionStatus the status of the subscription (subscribed or unsubscribed)
- * @param offset the offset for the data set
- * @param limit the limit for the data set
- * @return {@link DeviceSubscriptionResponseDTO} which contains the details of device subscriptions.
- * @throws ApplicationManagementException if an error occurs while fetching the subscription details
+ * Get subscription statistics related data describes by the {@link SubscriptionInfo}
+ * @param subscriptionInfo {@link SubscriptionInfo}
+ * @return {@link SubscriptionStatistics}
+ * @throws ApplicationManagementException Throws when error encountered while getting statistics
*/
- DeviceSubscriptionResponseDTO getAllSubscriptionDetailsByUUID(String uuid, String subscriptionStatus,
- PaginationRequest request, int offset,
- int limit) throws ApplicationManagementException;
+ SubscriptionStatistics getStatistics(SubscriptionInfo subscriptionInfo) throws ApplicationManagementException;
/**
* This method is responsible for retrieving device subscription details related to the given UUID.
diff --git a/components/application-mgt/io.entgra.device.mgt.core.application.mgt.core/pom.xml b/components/application-mgt/io.entgra.device.mgt.core.application.mgt.core/pom.xml
index b7bc729b98..1944506e53 100644
--- a/components/application-mgt/io.entgra.device.mgt.core.application.mgt.core/pom.xml
+++ b/components/application-mgt/io.entgra.device.mgt.core.application.mgt.core/pom.xml
@@ -21,7 +21,7 @@
io.entgra.device.mgt.core
application-mgt
- 5.2.1-SNAPSHOT
+ 5.2.4-SNAPSHOT
../pom.xml
diff --git a/components/application-mgt/io.entgra.device.mgt.core.application.mgt.core/src/main/java/io/entgra/device/mgt/core/application/mgt/core/dao/SubscriptionDAO.java b/components/application-mgt/io.entgra.device.mgt.core.application.mgt.core/src/main/java/io/entgra/device/mgt/core/application/mgt/core/dao/SubscriptionDAO.java
index ec3717391a..c35c4a5251 100644
--- a/components/application-mgt/io.entgra.device.mgt.core.application.mgt.core/src/main/java/io/entgra/device/mgt/core/application/mgt/core/dao/SubscriptionDAO.java
+++ b/components/application-mgt/io.entgra.device.mgt.core.application.mgt.core/src/main/java/io/entgra/device/mgt/core/application/mgt/core/dao/SubscriptionDAO.java
@@ -19,6 +19,8 @@ package io.entgra.device.mgt.core.application.mgt.core.dao;
import io.entgra.device.mgt.core.application.mgt.common.ExecutionStatus;
import io.entgra.device.mgt.core.application.mgt.common.dto.GroupSubscriptionDTO;
+import io.entgra.device.mgt.core.application.mgt.common.SubscriptionEntity;
+import io.entgra.device.mgt.core.application.mgt.common.dto.SubscriptionStatisticDTO;
import io.entgra.device.mgt.core.application.mgt.common.dto.SubscriptionsDTO;
import io.entgra.device.mgt.core.application.mgt.common.dto.DeviceSubscriptionDTO;
import io.entgra.device.mgt.core.application.mgt.common.dto.ApplicationReleaseDTO;
@@ -327,7 +329,7 @@ public interface SubscriptionDAO {
* @return {@link GroupSubscriptionDTO} which contains the details of group subscriptions.
* @throws ApplicationManagementDAOException if connection establishment fails.
*/
- List getGroupsSubscriptionDetailsByAppReleaseID(int appReleaseId, boolean unsubscribe, int tenantId, int offset, int limit)
+ List getGroupsSubscriptionDetailsByAppReleaseID(int appReleaseId, boolean unsubscribe, int tenantId, int offset, int limit)
throws ApplicationManagementDAOException;
/**
@@ -341,7 +343,7 @@ public interface SubscriptionDAO {
* @return {@link SubscriptionsDTO} which contains the details of subscriptions.
* @throws ApplicationManagementDAOException if connection establishment or SQL execution fails.
*/
- List getUserSubscriptionsByAppReleaseID(int appReleaseId, boolean unsubscribe, int tenantId,
+ List getUserSubscriptionsByAppReleaseID(int appReleaseId, boolean unsubscribe, int tenantId,
int offset, int limit) throws ApplicationManagementDAOException;
/**
@@ -355,7 +357,7 @@ public interface SubscriptionDAO {
* @return {@link SubscriptionsDTO} which contains the details of subscriptions.
* @throws ApplicationManagementDAOException if connection establishment or SQL execution fails.
*/
- List getRoleSubscriptionsByAppReleaseID(int appReleaseId, boolean unsubscribe, int tenantId, int offset, int limit)
+ List getRoleSubscriptionsByAppReleaseID(int appReleaseId, boolean unsubscribe, int tenantId, int offset, int limit)
throws ApplicationManagementDAOException;
/**
@@ -398,8 +400,11 @@ public interface SubscriptionDAO {
* @throws ApplicationManagementDAOException if connection establishment or SQL execution fails.
*/
List getSubscriptionDetailsByDeviceIds(int appReleaseId, boolean unsubscribe, int tenantId,
- List deviceIds, String actionStatus, String actionType,
- String actionTriggeredBy, String tabActionStatus) throws ApplicationManagementDAOException;
+ List deviceIds, List actionStatus, String actionType,
+ String actionTriggeredBy, int limit, int offset) throws ApplicationManagementDAOException;
+ int getDeviceSubscriptionCount(int appReleaseId, boolean unsubscribe, int tenantId,
+ List deviceIds, List actionStatus, String actionType,
+ String actionTriggeredBy) throws ApplicationManagementDAOException;
/**
* This method is used to get the details of device subscriptions related to a UUID.
@@ -415,9 +420,13 @@ public interface SubscriptionDAO {
* @return {@link DeviceOperationDTO} which contains the details of device subscriptions.
* @throws ApplicationManagementDAOException if connection establishment or SQL execution fails.
*/
- List getAllSubscriptionsDetails(int appReleaseId, boolean unsubscribe, int tenantId, String actionStatus, String actionType,
+ List getAllSubscriptionsDetails(int appReleaseId, boolean unsubscribe, int tenantId, List actionStatus, String actionType,
String actionTriggeredBy, int offset, int limit) throws ApplicationManagementDAOException;
+ int getAllSubscriptionsCount(int appReleaseId, boolean unsubscribe, int tenantId,
+ List actionStatus, String actionType, String actionTriggeredBy)
+ throws ApplicationManagementDAOException;
+
/**
* This method is used to get the counts of all subscription types related to a UUID.
*
@@ -517,4 +526,18 @@ public interface SubscriptionDAO {
* @throws ApplicationManagementDAOException if connection establishment or SQL execution fails.
*/
int getUserUnsubscriptionCount(int appReleaseId, int tenantId) throws ApplicationManagementDAOException;
+
+ SubscriptionStatisticDTO getSubscriptionStatistic(List deviceIds, boolean isUnsubscribed,
+ int tenantId, int appReleaseId) throws ApplicationManagementDAOException;
+ /**
+ * This method is used to get the counts of devices related to a UUID.
+ *
+ * @param appReleaseId the UUID of the application release.
+ * @param tenantId id of the current tenant.
+ * @param actionStatus categorized status.
+ * @param actionTriggeredFrom type of the action.
+ * @return {@link int} which contains the count of the subscription type
+ * @throws ApplicationManagementDAOException if connection establishment or SQL execution fails.
+ */
+ int countSubscriptionsByStatus(int appReleaseId, int tenantId, String actionStatus, String actionTriggeredFrom) throws ApplicationManagementDAOException;
}
diff --git a/components/application-mgt/io.entgra.device.mgt.core.application.mgt.core/src/main/java/io/entgra/device/mgt/core/application/mgt/core/dao/impl/application/GenericApplicationDAOImpl.java b/components/application-mgt/io.entgra.device.mgt.core.application.mgt.core/src/main/java/io/entgra/device/mgt/core/application/mgt/core/dao/impl/application/GenericApplicationDAOImpl.java
index 3047baf25b..0c4e6c12d7 100644
--- a/components/application-mgt/io.entgra.device.mgt.core.application.mgt.core/src/main/java/io/entgra/device/mgt/core/application/mgt/core/dao/impl/application/GenericApplicationDAOImpl.java
+++ b/components/application-mgt/io.entgra.device.mgt.core.application.mgt.core/src/main/java/io/entgra/device/mgt/core/application/mgt/core/dao/impl/application/GenericApplicationDAOImpl.java
@@ -309,7 +309,7 @@ public class GenericApplicationDAOImpl extends AbstractDAOImpl implements Applic
sql += " AND AP_APP_RELEASE.CURRENT_STATE = ?";
}
if (deviceTypeId != -1) {
- sql += "AND (AP_APP.DEVICE_TYPE_ID = ? ";
+ sql += " AND (AP_APP.DEVICE_TYPE_ID = ? ";
if (filter.isWithWebApps()) {
sql += "OR AP_APP.DEVICE_TYPE_ID = 0 ";
}
diff --git a/components/application-mgt/io.entgra.device.mgt.core.application.mgt.core/src/main/java/io/entgra/device/mgt/core/application/mgt/core/dao/impl/subscription/GenericSubscriptionDAOImpl.java b/components/application-mgt/io.entgra.device.mgt.core.application.mgt.core/src/main/java/io/entgra/device/mgt/core/application/mgt/core/dao/impl/subscription/GenericSubscriptionDAOImpl.java
index 322207c94e..66aec68576 100644
--- a/components/application-mgt/io.entgra.device.mgt.core.application.mgt.core/src/main/java/io/entgra/device/mgt/core/application/mgt/core/dao/impl/subscription/GenericSubscriptionDAOImpl.java
+++ b/components/application-mgt/io.entgra.device.mgt.core.application.mgt.core/src/main/java/io/entgra/device/mgt/core/application/mgt/core/dao/impl/subscription/GenericSubscriptionDAOImpl.java
@@ -17,14 +17,19 @@
*/
package io.entgra.device.mgt.core.application.mgt.core.dao.impl.subscription;
-import io.entgra.device.mgt.core.application.mgt.common.dto.GroupSubscriptionDTO;
+import io.entgra.device.mgt.core.application.mgt.common.SubscriptionMetadata;
import io.entgra.device.mgt.core.application.mgt.common.dto.DeviceOperationDTO;
-import io.entgra.device.mgt.core.application.mgt.common.dto.SubscriptionsDTO;
+import io.entgra.device.mgt.core.application.mgt.common.SubscriptionEntity;
+import io.entgra.device.mgt.core.application.mgt.common.dto.SubscriptionStatisticDTO;
import io.entgra.device.mgt.core.application.mgt.core.dao.SubscriptionDAO;
import io.entgra.device.mgt.core.application.mgt.core.dao.impl.AbstractDAOImpl;
import io.entgra.device.mgt.core.application.mgt.core.exception.UnexpectedServerErrorException;
import io.entgra.device.mgt.core.application.mgt.core.util.DAOUtil;
+import io.entgra.device.mgt.core.application.mgt.core.util.HelperUtil;
+import io.entgra.device.mgt.core.device.mgt.common.EnrolmentInfo;
+import io.entgra.device.mgt.core.device.mgt.common.exceptions.DeviceManagementException;
import io.entgra.device.mgt.core.device.mgt.common.operation.mgt.Activity;
+import io.entgra.device.mgt.core.device.mgt.core.service.DeviceManagementProviderService;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import io.entgra.device.mgt.core.application.mgt.common.ExecutionStatus;
@@ -43,9 +48,11 @@ import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
+import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import java.util.Objects;
import java.util.StringJoiner;
import java.util.stream.Collectors;
@@ -1642,45 +1649,60 @@ public class GenericSubscriptionDAOImpl extends AbstractDAOImpl implements Subsc
}
@Override
- public List getGroupsSubscriptionDetailsByAppReleaseID(int appReleaseId, boolean unsubscribe, int tenantId, int offset, int limit)
+ public List getGroupsSubscriptionDetailsByAppReleaseID(int appReleaseId, boolean unsubscribe, int tenantId, int offset, int limit)
throws ApplicationManagementDAOException {
if (log.isDebugEnabled()) {
log.debug("Request received in DAO Layer to get groups related to the given AppReleaseID.");
}
try {
Connection conn = this.getDBConnection();
- List groupDetails = new ArrayList<>();
+ List subscriptionEntities = new ArrayList<>();
String subscriptionStatusTime = unsubscribe ? "GS.UNSUBSCRIBED_TIMESTAMP" : "GS.SUBSCRIBED_TIMESTAMP";
- String sql = "SELECT GS.GROUP_NAME, GS.SUBSCRIBED_BY, GS.SUBSCRIBED_TIMESTAMP, GS.UNSUBSCRIBED, " +
- "GS.UNSUBSCRIBED_BY, GS.UNSUBSCRIBED_TIMESTAMP, GS.AP_APP_RELEASE_ID " +
+ String sql = "SELECT GS.GROUP_NAME, " +
+ "GS.SUBSCRIBED_BY, " +
+ "GS.SUBSCRIBED_TIMESTAMP, " +
+ "GS.UNSUBSCRIBED, " +
+ "GS.UNSUBSCRIBED_BY, " +
+ "GS.UNSUBSCRIBED_TIMESTAMP, " +
+ "GS.AP_APP_RELEASE_ID " +
"FROM AP_GROUP_SUBSCRIPTION GS " +
- "WHERE GS.AP_APP_RELEASE_ID = ? AND GS.UNSUBSCRIBED = ? AND GS.TENANT_ID = ? " +
- "ORDER BY " + subscriptionStatusTime + " DESC " +
- "LIMIT ? OFFSET ?";
+ "WHERE GS.AP_APP_RELEASE_ID = ? " +
+ "AND GS.UNSUBSCRIBED = ? " +
+ "AND GS.TENANT_ID = ? " +
+ "ORDER BY " + subscriptionStatusTime + " DESC ";
+
+ // Append limit and offset only if limit is not -1
+ if (limit != -1) {
+ sql = sql + " LIMIT ? OFFSET ?";
+ }
try (PreparedStatement ps = conn.prepareStatement(sql)) {
ps.setInt(1, appReleaseId);
ps.setBoolean(2, unsubscribe);
ps.setInt(3, tenantId);
- ps.setInt(4, limit);
- ps.setInt(5, offset);
+
+ // Set limit and offset parameters only if limit is not -1
+ if (limit != -1) {
+ ps.setInt(4, limit);
+ ps.setInt(5, offset);
+ }
try (ResultSet rs = ps.executeQuery()) {
- GroupSubscriptionDTO groupDetail;
+ SubscriptionEntity subscriptionEntity;
while (rs.next()) {
- groupDetail = new GroupSubscriptionDTO();
- groupDetail.setGroupName(rs.getString("GROUP_NAME"));
- groupDetail.setSubscribedBy(rs.getString("SUBSCRIBED_BY"));
- groupDetail.setSubscribedTimestamp(rs.getTimestamp("SUBSCRIBED_TIMESTAMP"));
- groupDetail.setUnsubscribed(rs.getBoolean("UNSUBSCRIBED"));
- groupDetail.setUnsubscribedBy(rs.getString("UNSUBSCRIBED_BY"));
- groupDetail.setUnsubscribedTimestamp(rs.getTimestamp("UNSUBSCRIBED_TIMESTAMP"));
- groupDetail.setAppReleaseId(rs.getInt("AP_APP_RELEASE_ID"));
-
- groupDetails.add(groupDetail);
+ subscriptionEntity = new SubscriptionEntity();
+ subscriptionEntity.setIdentity(rs.getString("GROUP_NAME"));
+ subscriptionEntity.setSubscribedBy(rs.getString("SUBSCRIBED_BY"));
+ subscriptionEntity.setSubscribedTimestamp(rs.getTimestamp("SUBSCRIBED_TIMESTAMP"));
+ subscriptionEntity.setUnsubscribed(rs.getBoolean("UNSUBSCRIBED"));
+ subscriptionEntity.setUnsubscribedBy(rs.getString("UNSUBSCRIBED_BY"));
+ subscriptionEntity.setUnsubscribedTimestamp(rs.getTimestamp("UNSUBSCRIBED_TIMESTAMP"));
+ subscriptionEntity.setApplicationReleaseId(rs.getInt("AP_APP_RELEASE_ID"));
+
+ subscriptionEntities.add(subscriptionEntity);
}
}
- return groupDetails;
+ return subscriptionEntities;
}
} catch (DBConnectionException e) {
String msg = "Error occurred while obtaining the DB connection to get groups for the given UUID.";
@@ -1694,20 +1716,27 @@ public class GenericSubscriptionDAOImpl extends AbstractDAOImpl implements Subsc
}
@Override
- public List getUserSubscriptionsByAppReleaseID(int appReleaseId, boolean unsubscribe, int tenantId,
+ public List getUserSubscriptionsByAppReleaseID(int appReleaseId, boolean unsubscribe, int tenantId,
int offset, int limit) throws ApplicationManagementDAOException {
if (log.isDebugEnabled()) {
log.debug("Request received in DAO Layer to get user subscriptions related to the given UUID.");
}
try {
Connection conn = this.getDBConnection();
- List userSubscriptions = new ArrayList<>();
+ List subscriptionEntities = new ArrayList<>();
String subscriptionStatusTime = unsubscribe ? "US.UNSUBSCRIBED_TIMESTAMP" : "US.SUBSCRIBED_TIMESTAMP";
- String sql = "SELECT US.USER_NAME, US.SUBSCRIBED_BY, US.SUBSCRIBED_TIMESTAMP, US.UNSUBSCRIBED, " +
- "US.UNSUBSCRIBED_BY, US.UNSUBSCRIBED_TIMESTAMP, US.AP_APP_RELEASE_ID " +
+ String sql = "SELECT US.USER_NAME, " +
+ "US.SUBSCRIBED_BY, " +
+ "US.SUBSCRIBED_TIMESTAMP, " +
+ "US.UNSUBSCRIBED, " +
+ "US.UNSUBSCRIBED_BY, " +
+ "US.UNSUBSCRIBED_TIMESTAMP, " +
+ "US.AP_APP_RELEASE_ID " +
"FROM AP_USER_SUBSCRIPTION US " +
- "WHERE US.AP_APP_RELEASE_ID = ? AND US.UNSUBSCRIBED = ? AND US.TENANT_ID = ? " +
+ "WHERE US.AP_APP_RELEASE_ID = ? " +
+ "AND US.UNSUBSCRIBED = ? " +
+ "AND US.TENANT_ID = ? " +
"ORDER BY " + subscriptionStatusTime + " DESC " +
"LIMIT ? OFFSET ?";
try (PreparedStatement ps = conn.prepareStatement(sql)) {
@@ -1717,21 +1746,21 @@ public class GenericSubscriptionDAOImpl extends AbstractDAOImpl implements Subsc
ps.setInt(4, limit);
ps.setInt(5, offset);
try (ResultSet rs = ps.executeQuery()) {
+ SubscriptionEntity subscriptionEntity;
while (rs.next()) {
- SubscriptionsDTO userSubscription;
- userSubscription = new SubscriptionsDTO();
- userSubscription.setName(rs.getString("USER_NAME"));
- userSubscription.setSubscribedBy(rs.getString("SUBSCRIBED_BY"));
- userSubscription.setSubscribedTimestamp(rs.getTimestamp("SUBSCRIBED_TIMESTAMP"));
- userSubscription.setUnsubscribed(rs.getBoolean("UNSUBSCRIBED"));
- userSubscription.setUnsubscribedBy(rs.getString("UNSUBSCRIBED_BY"));
- userSubscription.setUnsubscribedTimestamp(rs.getTimestamp("UNSUBSCRIBED_TIMESTAMP"));
- userSubscription.setAppReleaseId(rs.getInt("AP_APP_RELEASE_ID"));
-
- userSubscriptions.add(userSubscription);
+ subscriptionEntity = new SubscriptionEntity();
+ subscriptionEntity.setIdentity(rs.getString("USER_NAME"));
+ subscriptionEntity.setSubscribedBy(rs.getString("SUBSCRIBED_BY"));
+ subscriptionEntity.setSubscribedTimestamp(rs.getTimestamp("SUBSCRIBED_TIMESTAMP"));
+ subscriptionEntity.setUnsubscribed(rs.getBoolean("UNSUBSCRIBED"));
+ subscriptionEntity.setUnsubscribedBy(rs.getString("UNSUBSCRIBED_BY"));
+ subscriptionEntity.setUnsubscribedTimestamp(rs.getTimestamp("UNSUBSCRIBED_TIMESTAMP"));
+ subscriptionEntity.setApplicationReleaseId(rs.getInt("AP_APP_RELEASE_ID"));
+
+ subscriptionEntities.add(subscriptionEntity);
}
}
- return userSubscriptions;
+ return subscriptionEntities;
}
} catch (DBConnectionException e) {
String msg = "Error occurred while obtaining the DB connection to get user subscriptions for the given UUID.";
@@ -1745,20 +1774,27 @@ public class GenericSubscriptionDAOImpl extends AbstractDAOImpl implements Subsc
}
@Override
- public List getRoleSubscriptionsByAppReleaseID(int appReleaseId, boolean unsubscribe, int tenantId, int offset,
- int limit) throws ApplicationManagementDAOException {
+ public List getRoleSubscriptionsByAppReleaseID(int appReleaseId, boolean unsubscribe, int tenantId, int offset,
+ int limit) throws ApplicationManagementDAOException {
if (log.isDebugEnabled()) {
log.debug("Request received in DAO Layer to get role subscriptions related to the given AppReleaseID.");
}
try {
Connection conn = this.getDBConnection();
- List roleSubscriptions = new ArrayList<>();
+ List subscriptionEntities = new ArrayList<>();
String subscriptionStatusTime = unsubscribe ? "ARS.UNSUBSCRIBED_TIMESTAMP" : "ARS.SUBSCRIBED_TIMESTAMP";
- String sql = "SELECT ARS.ROLE_NAME, ARS.SUBSCRIBED_BY, ARS.SUBSCRIBED_TIMESTAMP, ARS.UNSUBSCRIBED, " +
- "ARS.UNSUBSCRIBED_BY, ARS.UNSUBSCRIBED_TIMESTAMP, ARS.AP_APP_RELEASE_ID " +
+ String sql = "SELECT ARS.ROLE_NAME, " +
+ "ARS.SUBSCRIBED_BY, " +
+ "ARS.SUBSCRIBED_TIMESTAMP, " +
+ "ARS.UNSUBSCRIBED, " +
+ "ARS.UNSUBSCRIBED_BY, " +
+ "ARS.UNSUBSCRIBED_TIMESTAMP, " +
+ "ARS.AP_APP_RELEASE_ID " +
"FROM AP_ROLE_SUBSCRIPTION ARS " +
- "WHERE ARS.AP_APP_RELEASE_ID = ? AND ARS.UNSUBSCRIBED = ? AND ARS.TENANT_ID = ? " +
+ "WHERE ARS.AP_APP_RELEASE_ID = ? " +
+ "AND ARS.UNSUBSCRIBED = ? " +
+ "AND ARS.TENANT_ID = ? " +
"ORDER BY " + subscriptionStatusTime + " DESC " +
"LIMIT ? OFFSET ?";
try (PreparedStatement ps = conn.prepareStatement(sql)) {
@@ -1768,21 +1804,21 @@ public class GenericSubscriptionDAOImpl extends AbstractDAOImpl implements Subsc
ps.setInt(4, limit);
ps.setInt(5, offset);
try (ResultSet rs = ps.executeQuery()) {
- SubscriptionsDTO roleSubscription;
+ SubscriptionEntity subscriptionEntity;
while (rs.next()) {
- roleSubscription = new SubscriptionsDTO();
- roleSubscription.setName(rs.getString("ROLE_NAME"));
- roleSubscription.setSubscribedBy(rs.getString("SUBSCRIBED_BY"));
- roleSubscription.setSubscribedTimestamp(rs.getTimestamp("SUBSCRIBED_TIMESTAMP"));
- roleSubscription.setUnsubscribed(rs.getBoolean("UNSUBSCRIBED"));
- roleSubscription.setUnsubscribedBy(rs.getString("UNSUBSCRIBED_BY"));
- roleSubscription.setUnsubscribedTimestamp(rs.getTimestamp("UNSUBSCRIBED_TIMESTAMP"));
- roleSubscription.setAppReleaseId(rs.getInt("AP_APP_RELEASE_ID"));
-
- roleSubscriptions.add(roleSubscription);
+ subscriptionEntity = new SubscriptionEntity();
+ subscriptionEntity.setIdentity(rs.getString("ROLE_NAME"));
+ subscriptionEntity.setSubscribedBy(rs.getString("SUBSCRIBED_BY"));
+ subscriptionEntity.setSubscribedTimestamp(rs.getTimestamp("SUBSCRIBED_TIMESTAMP"));
+ subscriptionEntity.setUnsubscribed(rs.getBoolean("UNSUBSCRIBED"));
+ subscriptionEntity.setUnsubscribedBy(rs.getString("UNSUBSCRIBED_BY"));
+ subscriptionEntity.setUnsubscribedTimestamp(rs.getTimestamp("UNSUBSCRIBED_TIMESTAMP"));
+ subscriptionEntity.setApplicationReleaseId(rs.getInt("AP_APP_RELEASE_ID"));
+
+ subscriptionEntities.add(subscriptionEntity);
}
}
- return roleSubscriptions;
+ return subscriptionEntities;
}
} catch (DBConnectionException e) {
String msg = "Error occurred while obtaining the DB connection to get role subscriptions for the given UUID.";
@@ -1911,14 +1947,20 @@ public class GenericSubscriptionDAOImpl extends AbstractDAOImpl implements Subsc
}
}
+ // passed the required list for the action status
@Override
public List getSubscriptionDetailsByDeviceIds(int appReleaseId, boolean unsubscribe, int tenantId,
- List deviceIds, String actionStatus, String actionType,
- String actionTriggeredBy, String tabActionStatus) throws ApplicationManagementDAOException {
+ List deviceIds, List actionStatus, String actionType,
+ String actionTriggeredBy, int limit, int offset) throws ApplicationManagementDAOException {
if (log.isDebugEnabled()) {
log.debug("Getting device subscriptions for the application release id " + appReleaseId
+ " and device ids " + deviceIds + " from the database");
}
+
+ if (deviceIds == null || deviceIds.isEmpty()) {
+ return Collections.emptyList();
+ }
+
try {
Connection conn = this.getDBConnection();
String subscriptionStatusTime = unsubscribe ? "DS.UNSUBSCRIBED_TIMESTAMP" : "DS.SUBSCRIBED_TIMESTAMP";
@@ -1933,11 +1975,15 @@ public class GenericSubscriptionDAOImpl extends AbstractDAOImpl implements Subsc
+ "DS.STATUS AS STATUS, "
+ "DS.DM_DEVICE_ID AS DEVICE_ID "
+ "FROM AP_DEVICE_SUBSCRIPTION DS "
- + "WHERE DS.AP_APP_RELEASE_ID = ? AND DS.UNSUBSCRIBED = ? AND DS.TENANT_ID = ? AND DS.DM_DEVICE_ID IN (" +
- deviceIds.stream().map(id -> "?").collect(Collectors.joining(",")) + ") ");
+ + "WHERE DS.AP_APP_RELEASE_ID = ? "
+ + "AND DS.UNSUBSCRIBED = ? "
+ + "AND DS.TENANT_ID = ? "
+ + "AND DS.DM_DEVICE_ID IN ("
+ + deviceIds.stream().map(id -> "?").collect(Collectors.joining(",")) + ") ");
if (actionStatus != null && !actionStatus.isEmpty()) {
- sql.append(" AND DS.STATUS = ? ");
+ sql.append(" AND DS.STATUS IN (").
+ append(actionStatus.stream().map(status -> "?").collect(Collectors.joining(","))).append(") ");
}
if (actionType != null && !actionType.isEmpty()) {
sql.append(" AND DS.ACTION_TRIGGERED_FROM = ? ");
@@ -1946,27 +1992,41 @@ public class GenericSubscriptionDAOImpl extends AbstractDAOImpl implements Subsc
sql.append(" AND DS.SUBSCRIBED_BY LIKE ? ");
}
- sql.append("ORDER BY ").append(subscriptionStatusTime).append(" DESC");
+ sql.append("ORDER BY ").append(subscriptionStatusTime).
+ append(" DESC ");
+
+ if (offset >= 0 && limit >= 0) {
+ sql.append("LIMIT ? OFFSET ?");
+ }
try (PreparedStatement ps = conn.prepareStatement(sql.toString())) {
int paramIdx = 1;
ps.setInt(paramIdx++, appReleaseId);
ps.setBoolean(paramIdx++, unsubscribe);
ps.setInt(paramIdx++, tenantId);
- for (int i = 0; i < deviceIds.size(); i++) {
- ps.setInt(paramIdx++, deviceIds.get(i));
+ for (Integer deviceId : deviceIds) {
+ ps.setInt(paramIdx++, deviceId);
}
if (actionStatus != null && !actionStatus.isEmpty()) {
- ps.setString(paramIdx++, actionStatus);
+ for (String status : actionStatus) {
+ ps.setString(paramIdx++, status);
+ }
}
+
if (actionType != null && !actionType.isEmpty()) {
ps.setString(paramIdx++, actionType);
}
+
if (actionTriggeredBy != null && !actionTriggeredBy.isEmpty()) {
ps.setString(paramIdx++, "%" + actionTriggeredBy + "%");
}
+ if (offset >= 0 && limit >= 0) {
+ ps.setInt(paramIdx++, limit);
+ ps.setInt(paramIdx, offset);
+ }
+
try (ResultSet rs = ps.executeQuery()) {
if (log.isDebugEnabled()) {
log.debug("Successfully retrieved device subscriptions for application release id "
@@ -2003,9 +2063,178 @@ public class GenericSubscriptionDAOImpl extends AbstractDAOImpl implements Subsc
}
+ @Override
+ public int getDeviceSubscriptionCount(int appReleaseId, boolean unsubscribe, int tenantId,
+ List deviceIds, List actionStatus, String actionType,
+ String actionTriggeredBy) throws ApplicationManagementDAOException {
+ int deviceCount = 0;
+
+ if (deviceIds == null || deviceIds.isEmpty()) return deviceCount;
+
+ try {
+ Connection conn = this.getDBConnection();
+ StringBuilder sql = new StringBuilder("SELECT COUNT(DISTINCT DS.DM_DEVICE_ID) AS COUNT "
+ + "FROM AP_DEVICE_SUBSCRIPTION DS "
+ + "WHERE DS.AP_APP_RELEASE_ID = ? "
+ + "AND DS.UNSUBSCRIBED = ? "
+ + "AND DS.TENANT_ID = ? "
+ + "AND DS.DM_DEVICE_ID IN ("
+ + deviceIds.stream().map(id -> "?").collect(Collectors.joining(",")) + ") ");
+
+ if (actionStatus != null && !actionStatus.isEmpty()) {
+ sql.append(" AND DS.STATUS IN (").
+ append(actionStatus.stream().map(status -> "?").collect(Collectors.joining(","))).append(") ");
+ }
+
+ if (actionType != null && !actionType.isEmpty()) {
+ sql.append(" AND DS.ACTION_TRIGGERED_FROM = ? ");
+ }
+ if (actionTriggeredBy != null && !actionTriggeredBy.isEmpty()) {
+ sql.append(" AND DS.SUBSCRIBED_BY LIKE ?");
+ }
+
+ try (PreparedStatement ps = conn.prepareStatement(sql.toString())) {
+ int paramIdx = 1;
+ ps.setInt(paramIdx++, appReleaseId);
+ ps.setBoolean(paramIdx++, unsubscribe);
+ ps.setInt(paramIdx++, tenantId);
+ for (Integer deviceId : deviceIds) {
+ ps.setInt(paramIdx++, deviceId);
+ }
+
+ if (actionStatus != null && !actionStatus.isEmpty()) {
+ for (String status : actionStatus) {
+ ps.setString(paramIdx++, status);
+ }
+ }
+
+ if (actionType != null && !actionType.isEmpty()) {
+ ps.setString(paramIdx++, actionType);
+ }
+
+ if (actionTriggeredBy != null && !actionTriggeredBy.isEmpty()) {
+ ps.setString(paramIdx, "%" + actionTriggeredBy + "%");
+ }
+
+ try (ResultSet rs = ps.executeQuery()) {
+ if (log.isDebugEnabled()) {
+ log.debug("Successfully retrieved device subscriptions for application release id "
+ + appReleaseId + " and device ids " + deviceIds);
+ }
+ if (rs.next()) {
+ deviceCount = rs.getInt("COUNT");
+ }
+ return deviceCount;
+ }
+ } catch (SQLException e) {
+ String msg = "Error occurred while running SQL to get device subscription data for application ID: " + appReleaseId
+ + " and device ids: " + deviceIds + ".";
+ log.error(msg, e);
+ throw new ApplicationManagementDAOException(msg, e);
+ }
+ } catch (DBConnectionException e) {
+ String msg = "Error occurred while obtaining the DB connection for getting device subscriptions for "
+ + "application Id: " + appReleaseId + " and device ids: " + deviceIds + ".";
+ log.error(msg, e);
+ throw new ApplicationManagementDAOException(msg, e);
+ }
+ }
+
+// @Override
+// public List getSubscriptionDetailsByDeviceIds(int appReleaseId, boolean unsubscribe, int tenantId,
+// List deviceIds, String actionStatus, String actionType,
+// String actionTriggeredBy, String tabActionStatus) throws ApplicationManagementDAOException {
+// if (log.isDebugEnabled()) {
+// log.debug("Getting device subscriptions for the application release id " + appReleaseId
+// + " and device ids " + deviceIds + " from the database");
+// }
+// try {
+// Connection conn = this.getDBConnection();
+// String subscriptionStatusTime = unsubscribe ? "DS.UNSUBSCRIBED_TIMESTAMP" : "DS.SUBSCRIBED_TIMESTAMP";
+// StringBuilder sql = new StringBuilder("SELECT "
+// + "DS.ID AS ID, "
+// + "DS.SUBSCRIBED_BY AS SUBSCRIBED_BY, "
+// + "DS.SUBSCRIBED_TIMESTAMP AS SUBSCRIBED_AT, "
+// + "DS.UNSUBSCRIBED AS IS_UNSUBSCRIBED, "
+// + "DS.UNSUBSCRIBED_BY AS UNSUBSCRIBED_BY, "
+// + "DS.UNSUBSCRIBED_TIMESTAMP AS UNSUBSCRIBED_AT, "
+// + "DS.ACTION_TRIGGERED_FROM AS ACTION_TRIGGERED_FROM, "
+// + "DS.STATUS AS STATUS, "
+// + "DS.DM_DEVICE_ID AS DEVICE_ID "
+// + "FROM AP_DEVICE_SUBSCRIPTION DS "
+// + "WHERE DS.AP_APP_RELEASE_ID = ? AND DS.UNSUBSCRIBED = ? AND DS.TENANT_ID = ? AND DS.DM_DEVICE_ID IN (" +
+// deviceIds.stream().map(id -> "?").collect(Collectors.joining(",")) + ") ");
+//
+// if (actionStatus != null && !actionStatus.isEmpty()) {
+// sql.append(" AND DS.STATUS = ? ");
+// }
+// if (actionType != null && !actionType.isEmpty()) {
+// sql.append(" AND DS.ACTION_TRIGGERED_FROM = ? ");
+// }
+// if (actionTriggeredBy != null && !actionTriggeredBy.isEmpty()) {
+// sql.append(" AND DS.SUBSCRIBED_BY LIKE ? ");
+// }
+//
+// sql.append("ORDER BY ").append(subscriptionStatusTime).append(" DESC");
+//
+// try (PreparedStatement ps = conn.prepareStatement(sql.toString())) {
+// int paramIdx = 1;
+// ps.setInt(paramIdx++, appReleaseId);
+// ps.setBoolean(paramIdx++, unsubscribe);
+// ps.setInt(paramIdx++, tenantId);
+// for (int i = 0; i < deviceIds.size(); i++) {
+// ps.setInt(paramIdx++, deviceIds.get(i));
+// }
+//
+// if (actionStatus != null && !actionStatus.isEmpty()) {
+// ps.setString(paramIdx++, actionStatus);
+// }
+// if (actionType != null && !actionType.isEmpty()) {
+// ps.setString(paramIdx++, actionType);
+// }
+// if (actionTriggeredBy != null && !actionTriggeredBy.isEmpty()) {
+// ps.setString(paramIdx++, "%" + actionTriggeredBy + "%");
+// }
+//
+// try (ResultSet rs = ps.executeQuery()) {
+// if (log.isDebugEnabled()) {
+// log.debug("Successfully retrieved device subscriptions for application release id "
+// + appReleaseId + " and device ids " + deviceIds);
+// }
+// List subscriptions = new ArrayList<>();
+// while (rs.next()) {
+// DeviceSubscriptionDTO subscription = new DeviceSubscriptionDTO();
+// subscription.setId(rs.getInt("ID"));
+// subscription.setSubscribedBy(rs.getString("SUBSCRIBED_BY"));
+// subscription.setSubscribedTimestamp(rs.getTimestamp("SUBSCRIBED_AT"));
+// subscription.setUnsubscribed(rs.getBoolean("IS_UNSUBSCRIBED"));
+// subscription.setUnsubscribedBy(rs.getString("UNSUBSCRIBED_BY"));
+// subscription.setUnsubscribedTimestamp(rs.getTimestamp("UNSUBSCRIBED_AT"));
+// subscription.setActionTriggeredFrom(rs.getString("ACTION_TRIGGERED_FROM"));
+// subscription.setStatus(rs.getString("STATUS"));
+// subscription.setDeviceId(rs.getInt("DEVICE_ID"));
+// subscriptions.add(subscription);
+// }
+// return subscriptions;
+// }
+// } catch (SQLException e) {
+// String msg = "Error occurred while running SQL to get device subscription data for application ID: " + appReleaseId
+// + " and device ids: " + deviceIds + ".";
+// log.error(msg, e);
+// throw new ApplicationManagementDAOException(msg, e);
+// }
+// } catch (DBConnectionException e) {
+// String msg = "Error occurred while obtaining the DB connection for getting device subscriptions for "
+// + "application Id: " + appReleaseId + " and device ids: " + deviceIds + ".";
+// log.error(msg, e);
+// throw new ApplicationManagementDAOException(msg, e);
+// }
+//
+// }
+
@Override
public List getAllSubscriptionsDetails(int appReleaseId, boolean unsubscribe, int tenantId,
- String actionStatus, String actionType, String actionTriggeredBy,
+ List actionStatus, String actionType, String actionTriggeredBy,
int offset, int limit) throws ApplicationManagementDAOException {
if (log.isDebugEnabled()) {
log.debug("Getting device subscriptions for the application release id " + appReleaseId
@@ -2025,11 +2254,15 @@ public class GenericSubscriptionDAOImpl extends AbstractDAOImpl implements Subsc
+ "DS.STATUS AS STATUS, "
+ "DS.DM_DEVICE_ID AS DEVICE_ID "
+ "FROM AP_DEVICE_SUBSCRIPTION DS "
- + "WHERE DS.AP_APP_RELEASE_ID = ? AND DS.UNSUBSCRIBED = ? AND DS.TENANT_ID = ? ");
+ + "WHERE DS.AP_APP_RELEASE_ID = ? "
+ + "AND DS.UNSUBSCRIBED = ? "
+ + "AND DS.TENANT_ID = ? ");
if (actionStatus != null && !actionStatus.isEmpty()) {
- sql.append(" AND DS.STATUS = ? ");
+ sql.append(" AND DS.STATUS IN (").
+ append(actionStatus.stream().map(status -> "?").collect(Collectors.joining(","))).append(") ");
}
+
if (actionType != null && !actionType.isEmpty()) {
sql.append(" AND DS.ACTION_TRIGGERED_FROM = ? ");
}
@@ -2037,8 +2270,11 @@ public class GenericSubscriptionDAOImpl extends AbstractDAOImpl implements Subsc
sql.append(" AND ").append(actionTriggeredColumn).append(" LIKE ? ");
}
- sql.append("ORDER BY ").append(subscriptionStatusTime).append(" DESC ")
- .append("LIMIT ? OFFSET ?");
+ sql.append("ORDER BY ").append(subscriptionStatusTime).append(" DESC ");
+
+ if (limit >= 0 && offset >= 0) {
+ sql.append("LIMIT ? OFFSET ?");
+ }
try {
Connection conn = this.getDBConnection();
@@ -2049,17 +2285,23 @@ public class GenericSubscriptionDAOImpl extends AbstractDAOImpl implements Subsc
ps.setInt(paramIdx++, tenantId);
if (actionStatus != null && !actionStatus.isEmpty()) {
- ps.setString(paramIdx++, actionStatus);
+ for (String status : actionStatus) {
+ ps.setString(paramIdx++, status);
+ }
}
+
if (actionType != null && !actionType.isEmpty()) {
ps.setString(paramIdx++, actionType);
}
+
if (actionTriggeredBy != null && !actionTriggeredBy.isEmpty()) {
ps.setString(paramIdx++, "%" + actionTriggeredBy + "%");
}
- ps.setInt(paramIdx++, limit);
- ps.setInt(paramIdx++, offset);
+ if (limit >= 0 && offset >= 0) {
+ ps.setInt(paramIdx++, limit);
+ ps.setInt(paramIdx, offset);
+ }
try (ResultSet rs = ps.executeQuery()) {
if (log.isDebugEnabled()) {
@@ -2098,23 +2340,105 @@ public class GenericSubscriptionDAOImpl extends AbstractDAOImpl implements Subsc
}
@Override
- public int getAllSubscriptionCount(int appReleaseId, int tenantId)
+ public int getAllSubscriptionsCount(int appReleaseId, boolean unsubscribe, int tenantId,
+ List actionStatus, String actionType, String actionTriggeredBy)
throws ApplicationManagementDAOException {
if (log.isDebugEnabled()) {
- log.debug("Getting all subscriptions count for the application appReleaseId " + appReleaseId
+ log.debug("Getting device subscriptions for the application release id " + appReleaseId
+ " from the database");
}
+ String actionTriggeredColumn = unsubscribe ? "DS.UNSUBSCRIBED_BY" : "DS.SUBSCRIBED_BY";
+ StringBuilder sql = new StringBuilder("SELECT COUNT(DISTINCT DS.DM_DEVICE_ID) AS COUNT "
+ + "FROM AP_DEVICE_SUBSCRIPTION DS "
+ + "WHERE DS.AP_APP_RELEASE_ID = ? "
+ + "AND DS.UNSUBSCRIBED = ? "
+ + "AND DS.TENANT_ID = ? ");
+
+ if (actionStatus != null && !actionStatus.isEmpty()) {
+ sql.append(" AND DS.STATUS IN (").
+ append(actionStatus.stream().map(status -> "?").collect(Collectors.joining(","))).append(") ");
+ }
+ if (actionType != null && !actionType.isEmpty()) {
+ sql.append(" AND DS.ACTION_TRIGGERED_FROM = ? ");
+ }
+ if (actionTriggeredBy != null && !actionTriggeredBy.isEmpty()) {
+ sql.append(" AND ").append(actionTriggeredColumn).append(" LIKE ?");
+ }
+ try {
+ Connection conn = this.getDBConnection();
+ try (PreparedStatement ps = conn.prepareStatement(sql.toString())) {
+ int paramIdx = 1;
+ ps.setInt(paramIdx++, appReleaseId);
+ ps.setBoolean(paramIdx++, unsubscribe);
+ ps.setInt(paramIdx++, tenantId);
+
+ if (actionStatus != null && !actionStatus.isEmpty()) {
+ for (String status : actionStatus) {
+ ps.setString(paramIdx++, status);
+ }
+ }
+ if (actionType != null && !actionType.isEmpty()) {
+ ps.setString(paramIdx++, actionType);
+ }
+ if (actionTriggeredBy != null && !actionTriggeredBy.isEmpty()) {
+ ps.setString(paramIdx++, "%" + actionTriggeredBy + "%");
+ }
+ try (ResultSet rs = ps.executeQuery()) {
+ if (log.isDebugEnabled()) {
+ log.debug("Successfully retrieved device subscriptions for application release id "
+ + appReleaseId);
+ }
+ return rs.next() ? rs.getInt("COUNT") : 0;
+ }
+ }
+ } catch (DBConnectionException e) {
+ String msg = "Error occurred while obtaining the DB connection for getting device subscription for "
+ + "application Id: " + appReleaseId + ".";
+ log.error(msg, e);
+ throw new ApplicationManagementDAOException(msg, e);
+ } catch (SQLException e) {
+ String msg = "Error occurred while running SQL to get device subscription data for application ID: " + appReleaseId;
+ log.error(msg, e);
+ throw new ApplicationManagementDAOException(msg, e);
+ }
+ }
+
+ @Override
+ public int getAllSubscriptionCount(int appReleaseId, int tenantId) throws ApplicationManagementDAOException {
+ if (log.isDebugEnabled()) {
+ log.debug("Getting all subscriptions count for the application appReleaseId " + appReleaseId + " from the database");
+ }
+ List allowingDeviceStatuses = new ArrayList<>();
+ allowingDeviceStatuses.add(EnrolmentInfo.Status.ACTIVE.toString());
+ allowingDeviceStatuses.add(EnrolmentInfo.Status.INACTIVE.toString());
+ allowingDeviceStatuses.add(EnrolmentInfo.Status.UNREACHABLE.toString());
+
+ DeviceManagementProviderService deviceManagementProviderService = HelperUtil.getDeviceManagementProviderService();
try {
Connection conn = this.getDBConnection();
+ List deviceIds = deviceManagementProviderService.getDeviceIdsByStatus(allowingDeviceStatuses);
+ if (deviceIds.isEmpty()) {
+ return 0;
+ }
+ StringBuilder idList = new StringBuilder();
+ for (int i = 0; i < deviceIds.size(); i++) {
+ idList.append("?");
+ if (i < deviceIds.size() - 1) {
+ idList.append(",");
+ }
+ }
String sql = "SELECT COUNT(*) AS count " +
"FROM AP_DEVICE_SUBSCRIPTION " +
"WHERE AP_APP_RELEASE_ID = ? " +
"AND TENANT_ID = ? " +
- "AND UNSUBSCRIBED = FALSE";
-
+ "AND UNSUBSCRIBED = FALSE " +
+ "AND DM_DEVICE_ID IN (" + idList.toString() + ")";
try (PreparedStatement ps = conn.prepareStatement(sql)) {
ps.setInt(1, appReleaseId);
ps.setInt(2, tenantId);
+ for (int i = 0; i < deviceIds.size(); i++) {
+ ps.setInt(3 + i, deviceIds.get(i));
+ }
try (ResultSet rs = ps.executeQuery()) {
if (rs.next()) {
@@ -2128,7 +2452,7 @@ public class GenericSubscriptionDAOImpl extends AbstractDAOImpl implements Subsc
log.error(msg, e);
throw new ApplicationManagementDAOException(msg, e);
}
- } catch (DBConnectionException e) {
+ } catch (DBConnectionException | DeviceManagementException e) {
String msg = "Error occurred while obtaining the DB connection for getting all subscriptions count for appReleaseId: "
+ appReleaseId + ".";
log.error(msg, e);
@@ -2137,23 +2461,41 @@ public class GenericSubscriptionDAOImpl extends AbstractDAOImpl implements Subsc
}
@Override
- public int getAllUnsubscriptionCount(int appReleaseId, int tenantId)
- throws ApplicationManagementDAOException {
+ public int getAllUnsubscriptionCount(int appReleaseId, int tenantId) throws ApplicationManagementDAOException {
if (log.isDebugEnabled()) {
- log.debug("Getting all unsubscription count for the application appReleaseId " + appReleaseId
- + " from the database");
+ log.debug("Getting all unsubscription count for the application appReleaseId " + appReleaseId + " from the database");
}
+ List allowingDeviceStatuses = new ArrayList<>();
+ allowingDeviceStatuses.add(EnrolmentInfo.Status.ACTIVE.toString());
+ allowingDeviceStatuses.add(EnrolmentInfo.Status.INACTIVE.toString());
+ allowingDeviceStatuses.add(EnrolmentInfo.Status.UNREACHABLE.toString());
+
+ DeviceManagementProviderService deviceManagementProviderService = HelperUtil.getDeviceManagementProviderService();
try {
Connection conn = this.getDBConnection();
+ List deviceIds = deviceManagementProviderService.getDeviceIdsByStatus(allowingDeviceStatuses);
+ if (deviceIds.isEmpty()) {
+ return 0;
+ }
+ StringBuilder idList = new StringBuilder();
+ for (int i = 0; i < deviceIds.size(); i++) {
+ idList.append("?");
+ if (i < deviceIds.size() - 1) {
+ idList.append(",");
+ }
+ }
String sql = "SELECT COUNT(*) AS count " +
"FROM AP_DEVICE_SUBSCRIPTION " +
"WHERE AP_APP_RELEASE_ID = ? " +
"AND TENANT_ID = ? " +
- "AND UNSUBSCRIBED = TRUE";
-
+ "AND UNSUBSCRIBED = TRUE " +
+ "AND DM_DEVICE_ID IN (" + idList.toString() + ")";
try (PreparedStatement ps = conn.prepareStatement(sql)) {
ps.setInt(1, appReleaseId);
ps.setInt(2, tenantId);
+ for (int i = 0; i < deviceIds.size(); i++) {
+ ps.setInt(3 + i, deviceIds.get(i));
+ }
try (ResultSet rs = ps.executeQuery()) {
if (rs.next()) {
@@ -2167,7 +2509,7 @@ public class GenericSubscriptionDAOImpl extends AbstractDAOImpl implements Subsc
log.error(msg, e);
throw new ApplicationManagementDAOException(msg, e);
}
- } catch (DBConnectionException e) {
+ } catch (DBConnectionException | DeviceManagementException e) {
String msg = "Error occurred while obtaining the DB connection for getting all unsubscription count for appReleaseId: "
+ appReleaseId + ".";
log.error(msg, e);
@@ -2488,4 +2830,97 @@ public class GenericSubscriptionDAOImpl extends AbstractDAOImpl implements Subsc
throw new ApplicationManagementDAOException(msg, e);
}
}
+
+ @Override
+ public SubscriptionStatisticDTO getSubscriptionStatistic(List deviceIds, boolean isUnsubscribed, int tenantId, int appReleaseId)
+ throws ApplicationManagementDAOException {
+ SubscriptionStatisticDTO subscriptionStatisticDTO = new SubscriptionStatisticDTO();
+ if (deviceIds == null || deviceIds.isEmpty()) return subscriptionStatisticDTO;
+
+ try {
+ Connection connection = getDBConnection();
+ String sql = "SELECT COUNT(DISTINCT ID) AS COUNT, " +
+ "STATUS FROM AP_DEVICE_SUBSCRIPTION " +
+ "WHERE TENANT_ID = ? " +
+ "AND AP_APP_RELEASE_ID = ? " +
+ "AND UNSUBSCRIBED = ? " +
+ "AND DM_DEVICE_ID IN (" +
+ deviceIds.stream().map(id -> "?").collect(Collectors.joining(",")) + ") " +
+ "GROUP BY (STATUS)";
+
+ try (PreparedStatement preparedStatement = connection.prepareStatement(sql)) {
+ int idx = 1;
+
+ preparedStatement.setInt(idx++, tenantId);
+ preparedStatement.setInt(idx++, appReleaseId);
+ preparedStatement.setBoolean(idx++, isUnsubscribed);
+ for (Integer deviceId : deviceIds) {
+ preparedStatement.setInt(idx++, deviceId);
+ }
+
+ try (ResultSet resultSet = preparedStatement.executeQuery()) {
+ while (resultSet.next()) {
+ // add the error and in progress
+ int count = resultSet.getInt("COUNT");
+ String status = resultSet.getString("STATUS");
+
+ if (SubscriptionMetadata.DBSubscriptionStatus.COMPLETED_STATUS_LIST.contains(status)) {
+ subscriptionStatisticDTO.addToComplete(count);
+ }
+
+ if (SubscriptionMetadata.DBSubscriptionStatus.PENDING_STATUS_LIST.contains(status)) {
+ subscriptionStatisticDTO.addToPending(count);
+ }
+ if (SubscriptionMetadata.DBSubscriptionStatus.ERROR_STATUS_LIST.contains(status)) {
+ subscriptionStatisticDTO.addToFailed(count);
+ }
+ }
+ }
+ }
+ return subscriptionStatisticDTO;
+ } catch (DBConnectionException e) {
+ String msg = "Error occurred while obtaining the DB connection for getting subscription statistics";
+ log.error(msg, e);
+ throw new ApplicationManagementDAOException(msg, e);
+ } catch (SQLException e) {
+ String msg = "Error occurred while running SQL for getting subscription statistics";
+ log.error(msg, e);
+ throw new ApplicationManagementDAOException(msg, e);
+ }
+ }
+
+ public int countSubscriptionsByStatus(int appReleaseId, int tenantId, String actionStatus, String actionTriggeredFrom) throws ApplicationManagementDAOException {
+ if (log.isDebugEnabled()) {
+ log.debug("Request received in DAO Layer to count device subscriptions by status and actionTriggeredFrom for the given AppReleaseID.");
+ }
+ try {
+ Connection conn = this.getDBConnection();
+ String sql = "SELECT COUNT(*) FROM AP_DEVICE_SUBSCRIPTION " +
+ "WHERE AP_APP_RELEASE_ID = ? " +
+ "AND TENANT_ID = ? " +
+ "AND STATUS = ?" +
+ " AND ACTION_TRIGGERED_FROM = ?";
+ try (PreparedStatement ps = conn.prepareStatement(sql)) {
+ ps.setInt(1, appReleaseId);
+ ps.setInt(2, tenantId);
+ ps.setString(3, actionStatus);
+ ps.setString(4, actionTriggeredFrom);
+ try (ResultSet rs = ps.executeQuery()) {
+ if (rs.next()) {
+ return rs.getInt(1);
+ }
+ }
+ }
+ } catch (DBConnectionException e) {
+ String msg = "Error occurred while obtaining the DB connection to count device subscriptions by status and action trigger.";
+ log.error(msg, e);
+ throw new ApplicationManagementDAOException(msg, e);
+ } catch (SQLException e) {
+ String msg = "SQL Error occurred while counting device subscriptions by status and action trigger.";
+ log.error(msg, e);
+ throw new ApplicationManagementDAOException(msg, e);
+ }
+ return 0;
+ }
+
}
diff --git a/components/application-mgt/io.entgra.device.mgt.core.application.mgt.core/src/main/java/io/entgra/device/mgt/core/application/mgt/core/dao/impl/subscription/OracleSubscriptionDAOImpl.java b/components/application-mgt/io.entgra.device.mgt.core.application.mgt.core/src/main/java/io/entgra/device/mgt/core/application/mgt/core/dao/impl/subscription/OracleSubscriptionDAOImpl.java
index 47b5f78799..f66051e308 100644
--- a/components/application-mgt/io.entgra.device.mgt.core.application.mgt.core/src/main/java/io/entgra/device/mgt/core/application/mgt/core/dao/impl/subscription/OracleSubscriptionDAOImpl.java
+++ b/components/application-mgt/io.entgra.device.mgt.core.application.mgt.core/src/main/java/io/entgra/device/mgt/core/application/mgt/core/dao/impl/subscription/OracleSubscriptionDAOImpl.java
@@ -18,6 +18,8 @@
package io.entgra.device.mgt.core.application.mgt.core.dao.impl.subscription;
+import io.entgra.device.mgt.core.application.mgt.common.SubscriptionEntity;
+import io.entgra.device.mgt.core.application.mgt.common.dto.DeviceSubscriptionDTO;
import io.entgra.device.mgt.core.application.mgt.common.exception.DBConnectionException;
import io.entgra.device.mgt.core.application.mgt.core.exception.ApplicationManagementDAOException;
import org.apache.commons.logging.Log;
@@ -28,7 +30,9 @@ import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
+import java.util.Collections;
import java.util.List;
+import java.util.stream.Collectors;
/**
* This handles Application subscribing operations which are specific to Oracle.
@@ -157,4 +161,379 @@ public class OracleSubscriptionDAOImpl extends GenericSubscriptionDAOImpl {
throw new ApplicationManagementDAOException(msg, e);
}
}
+
+ // passed the required list for the action status
+ @Override
+ public List getSubscriptionDetailsByDeviceIds(int appReleaseId, boolean unsubscribe, int tenantId,
+ List deviceIds, List actionStatus, String actionType,
+ String actionTriggeredBy, int limit, int offset) throws ApplicationManagementDAOException {
+ if (log.isDebugEnabled()) {
+ log.debug("Getting device subscriptions for the application release id " + appReleaseId
+ + " and device ids " + deviceIds + " from the database");
+ }
+ if (deviceIds == null || deviceIds.isEmpty()) {
+ return Collections.emptyList();
+ }
+ try {
+ Connection conn = this.getDBConnection();
+ String subscriptionStatusTime = unsubscribe ? "DS.UNSUBSCRIBED_TIMESTAMP" : "DS.SUBSCRIBED_TIMESTAMP";
+ StringBuilder sql = new StringBuilder("SELECT "
+ + "DS.ID AS ID, "
+ + "DS.SUBSCRIBED_BY AS SUBSCRIBED_BY, "
+ + "DS.SUBSCRIBED_TIMESTAMP AS SUBSCRIBED_AT, "
+ + "DS.UNSUBSCRIBED AS IS_UNSUBSCRIBED, "
+ + "DS.UNSUBSCRIBED_BY AS UNSUBSCRIBED_BY, "
+ + "DS.UNSUBSCRIBED_TIMESTAMP AS UNSUBSCRIBED_AT, "
+ + "DS.ACTION_TRIGGERED_FROM AS ACTION_TRIGGERED_FROM, "
+ + "DS.STATUS AS STATUS, "
+ + "DS.DM_DEVICE_ID AS DEVICE_ID "
+ + "FROM AP_DEVICE_SUBSCRIPTION DS "
+ + "WHERE DS.AP_APP_RELEASE_ID = ? "
+ + "AND DS.UNSUBSCRIBED = ? "
+ + "AND DS.TENANT_ID = ? "
+ + "AND DS.DM_DEVICE_ID IN ("
+ + deviceIds.stream().map(id -> "?").collect(Collectors.joining(",")) + ") ");
+ if (actionStatus != null && !actionStatus.isEmpty()) {
+ sql.append(" AND DS.STATUS IN (").
+ append(actionStatus.stream().map(status -> "?").collect(Collectors.joining(","))).append(") ");
+ }
+ if (actionType != null && !actionType.isEmpty()) {
+ sql.append(" AND DS.ACTION_TRIGGERED_FROM = ? ");
+ }
+ if (actionTriggeredBy != null && !actionTriggeredBy.isEmpty()) {
+ sql.append(" AND DS.SUBSCRIBED_BY LIKE ? ");
+ }
+ sql.append("ORDER BY ").append(subscriptionStatusTime).
+ append(" DESC ");
+ if (offset >= 0 && limit >= 0) {
+ sql.append("OFFSET ? ROWS FETCH NEXT ? ROWS ONLY");
+ }
+ try (PreparedStatement ps = conn.prepareStatement(sql.toString())) {
+ int paramIdx = 1;
+ ps.setInt(paramIdx++, appReleaseId);
+ ps.setBoolean(paramIdx++, unsubscribe);
+ ps.setInt(paramIdx++, tenantId);
+ for (Integer deviceId : deviceIds) {
+ ps.setInt(paramIdx++, deviceId);
+ }
+ if (actionStatus != null && !actionStatus.isEmpty()) {
+ for (String status : actionStatus) {
+ ps.setString(paramIdx++, status);
+ }
+ }
+ if (actionType != null && !actionType.isEmpty()) {
+ ps.setString(paramIdx++, actionType);
+ }
+ if (actionTriggeredBy != null && !actionTriggeredBy.isEmpty()) {
+ ps.setString(paramIdx++, "%" + actionTriggeredBy + "%");
+ }
+ if (offset >= 0 && limit >= 0) {
+ ps.setInt(paramIdx++, offset);
+ ps.setInt(paramIdx, limit);
+ }
+ try (ResultSet rs = ps.executeQuery()) {
+ if (log.isDebugEnabled()) {
+ log.debug("Successfully retrieved device subscriptions for application release id "
+ + appReleaseId + " and device ids " + deviceIds);
+ }
+ List subscriptions = new ArrayList<>();
+ while (rs.next()) {
+ DeviceSubscriptionDTO subscription = new DeviceSubscriptionDTO();
+ subscription.setId(rs.getInt("ID"));
+ subscription.setSubscribedBy(rs.getString("SUBSCRIBED_BY"));
+ subscription.setSubscribedTimestamp(rs.getTimestamp("SUBSCRIBED_AT"));
+ subscription.setUnsubscribed(rs.getBoolean("IS_UNSUBSCRIBED"));
+ subscription.setUnsubscribedBy(rs.getString("UNSUBSCRIBED_BY"));
+ subscription.setUnsubscribedTimestamp(rs.getTimestamp("UNSUBSCRIBED_AT"));
+ subscription.setActionTriggeredFrom(rs.getString("ACTION_TRIGGERED_FROM"));
+ subscription.setStatus(rs.getString("STATUS"));
+ subscription.setDeviceId(rs.getInt("DEVICE_ID"));
+ subscriptions.add(subscription);
+ }
+ return subscriptions;
+ }
+ } catch (SQLException e) {
+ String msg = "Error occurred while running SQL to get device subscription data for application ID: " + appReleaseId
+ + " and device ids: " + deviceIds + ".";
+ log.error(msg, e);
+ throw new ApplicationManagementDAOException(msg, e);
+ }
+ } catch (DBConnectionException e) {
+ String msg = "Error occurred while obtaining the DB connection for getting device subscriptions for "
+ + "application Id: " + appReleaseId + " and device ids: " + deviceIds + ".";
+ log.error(msg, e);
+ throw new ApplicationManagementDAOException(msg, e);
+ }
+ }
+
+ @Override
+ public List getRoleSubscriptionsByAppReleaseID(int appReleaseId, boolean unsubscribe, int tenantId, int offset,
+ int limit) throws ApplicationManagementDAOException {
+ if (log.isDebugEnabled()) {
+ log.debug("Request received in DAO Layer to get role subscriptions related to the given AppReleaseID.");
+ }
+ try {
+ Connection conn = this.getDBConnection();
+ List subscriptionEntities = new ArrayList<>();
+
+ String subscriptionStatusTime = unsubscribe ? "ARS.UNSUBSCRIBED_TIMESTAMP" : "ARS.SUBSCRIBED_TIMESTAMP";
+ String sql = "SELECT ARS.ROLE_NAME, " +
+ "ARS.SUBSCRIBED_BY, " +
+ "ARS.SUBSCRIBED_TIMESTAMP, " +
+ "ARS.UNSUBSCRIBED, " +
+ "ARS.UNSUBSCRIBED_BY, " +
+ "ARS.UNSUBSCRIBED_TIMESTAMP, " +
+ "ARS.AP_APP_RELEASE_ID " +
+ "FROM AP_ROLE_SUBSCRIPTION ARS " +
+ "WHERE ARS.AP_APP_RELEASE_ID = ? " +
+ "AND ARS.UNSUBSCRIBED = ? " +
+ "AND ARS.TENANT_ID = ? " +
+ "ORDER BY " + subscriptionStatusTime + " DESC " +
+ "OFFSET ? ROWS FETCH NEXT ? ROWS ONLY";
+
+ try (PreparedStatement ps = conn.prepareStatement(sql)) {
+ ps.setInt(1, appReleaseId);
+ ps.setBoolean(2, unsubscribe);
+ ps.setInt(3, tenantId);
+ ps.setInt(4, offset);
+ ps.setInt(5, limit);
+ try (ResultSet rs = ps.executeQuery()) {
+ SubscriptionEntity subscriptionEntity;
+ while (rs.next()) {
+ subscriptionEntity = new SubscriptionEntity();
+ subscriptionEntity.setIdentity(rs.getString("ROLE_NAME"));
+ subscriptionEntity.setSubscribedBy(rs.getString("SUBSCRIBED_BY"));
+ subscriptionEntity.setSubscribedTimestamp(rs.getTimestamp("SUBSCRIBED_TIMESTAMP"));
+ subscriptionEntity.setUnsubscribed(rs.getBoolean("UNSUBSCRIBED"));
+ subscriptionEntity.setUnsubscribedBy(rs.getString("UNSUBSCRIBED_BY"));
+ subscriptionEntity.setUnsubscribedTimestamp(rs.getTimestamp("UNSUBSCRIBED_TIMESTAMP"));
+ subscriptionEntity.setApplicationReleaseId(rs.getInt("AP_APP_RELEASE_ID"));
+
+ subscriptionEntities.add(subscriptionEntity);
+ }
+ }
+ return subscriptionEntities;
+ }
+ } catch (DBConnectionException e) {
+ String msg = "Error occurred while obtaining the DB connection to get role subscriptions for the given UUID.";
+ log.error(msg, e);
+ throw new ApplicationManagementDAOException(msg, e);
+ } catch (SQLException e) {
+ String msg = "SQL Error occurred while getting role subscriptions for the given UUID.";
+ log.error(msg, e);
+ throw new ApplicationManagementDAOException(msg, e);
+ }
+ }
+
+ @Override
+ public List getUserSubscriptionsByAppReleaseID(int appReleaseId, boolean unsubscribe, int tenantId,
+ int offset, int limit) throws ApplicationManagementDAOException {
+ if (log.isDebugEnabled()) {
+ log.debug("Request received in DAO Layer to get user subscriptions related to the given UUID.");
+ }
+ try {
+ Connection conn = this.getDBConnection();
+ List subscriptionEntities = new ArrayList<>();
+
+ String subscriptionStatusTime = unsubscribe ? "US.UNSUBSCRIBED_TIMESTAMP" : "US.SUBSCRIBED_TIMESTAMP";
+ String sql = "SELECT US.USER_NAME, " +
+ "US.SUBSCRIBED_BY, " +
+ "US.SUBSCRIBED_TIMESTAMP, " +
+ "US.UNSUBSCRIBED, " +
+ "US.UNSUBSCRIBED_BY, " +
+ "US.UNSUBSCRIBED_TIMESTAMP, " +
+ "US.AP_APP_RELEASE_ID " +
+ "FROM AP_USER_SUBSCRIPTION US " +
+ "WHERE US.AP_APP_RELEASE_ID = ? " +
+ "AND US.UNSUBSCRIBED = ? " +
+ "AND US.TENANT_ID = ? " +
+ "ORDER BY " + subscriptionStatusTime + " DESC " +
+ "OFFSET ? ROWS FETCH NEXT ? ROWS ONLY";
+
+ try (PreparedStatement ps = conn.prepareStatement(sql)) {
+ ps.setInt(1, appReleaseId);
+ ps.setBoolean(2, unsubscribe);
+ ps.setInt(3, tenantId);
+ ps.setInt(4, offset);
+ ps.setInt(5, limit);
+ try (ResultSet rs = ps.executeQuery()) {
+ SubscriptionEntity subscriptionEntity;
+ while (rs.next()) {
+ subscriptionEntity = new SubscriptionEntity();
+ subscriptionEntity.setIdentity(rs.getString("USER_NAME"));
+ subscriptionEntity.setSubscribedBy(rs.getString("SUBSCRIBED_BY"));
+ subscriptionEntity.setSubscribedTimestamp(rs.getTimestamp("SUBSCRIBED_TIMESTAMP"));
+ subscriptionEntity.setUnsubscribed(rs.getBoolean("UNSUBSCRIBED"));
+ subscriptionEntity.setUnsubscribedBy(rs.getString("UNSUBSCRIBED_BY"));
+ subscriptionEntity.setUnsubscribedTimestamp(rs.getTimestamp("UNSUBSCRIBED_TIMESTAMP"));
+ subscriptionEntity.setApplicationReleaseId(rs.getInt("AP_APP_RELEASE_ID"));
+
+ subscriptionEntities.add(subscriptionEntity);
+ }
+ }
+ return subscriptionEntities;
+ }
+ } catch (DBConnectionException e) {
+ String msg = "Error occurred while obtaining the DB connection to get user subscriptions for the given UUID.";
+ log.error(msg, e);
+ throw new ApplicationManagementDAOException(msg, e);
+ } catch (SQLException e) {
+ String msg = "SQL Error occurred while getting user subscriptions for the given UUID.";
+ log.error(msg, e);
+ throw new ApplicationManagementDAOException(msg, e);
+ }
+ }
+
+ @Override
+ public List getGroupsSubscriptionDetailsByAppReleaseID(int appReleaseId, boolean unsubscribe, int tenantId, int offset, int limit)
+ throws ApplicationManagementDAOException {
+ if (log.isDebugEnabled()) {
+ log.debug("Request received in DAO Layer to get groups related to the given AppReleaseID.");
+ }
+ try {
+ Connection conn = this.getDBConnection();
+ List subscriptionEntities = new ArrayList<>();
+
+ String subscriptionStatusTime = unsubscribe ? "GS.UNSUBSCRIBED_TIMESTAMP" : "GS.SUBSCRIBED_TIMESTAMP";
+ String sql = "SELECT GS.GROUP_NAME, " +
+ "GS.SUBSCRIBED_BY, " +
+ "GS.SUBSCRIBED_TIMESTAMP, " +
+ "GS.UNSUBSCRIBED, " +
+ "GS.UNSUBSCRIBED_BY, " +
+ "GS.UNSUBSCRIBED_TIMESTAMP, " +
+ "GS.AP_APP_RELEASE_ID " +
+ "FROM AP_GROUP_SUBSCRIPTION GS " +
+ "WHERE GS.AP_APP_RELEASE_ID = ? " +
+ "AND GS.UNSUBSCRIBED = ? AND GS.TENANT_ID = ? " +
+ "ORDER BY " + subscriptionStatusTime + " DESC " +
+ "OFFSET ? ROWS FETCH NEXT ? ROWS ONLY";
+
+ try (PreparedStatement ps = conn.prepareStatement(sql)) {
+ ps.setInt(1, appReleaseId);
+ ps.setBoolean(2, unsubscribe);
+ ps.setInt(3, tenantId);
+ ps.setInt(4, offset);
+ ps.setInt(5, limit);
+
+ try (ResultSet rs = ps.executeQuery()) {
+ SubscriptionEntity subscriptionEntity;
+ while (rs.next()) {
+ subscriptionEntity = new SubscriptionEntity();
+ subscriptionEntity.setIdentity(rs.getString("GROUP_NAME"));
+ subscriptionEntity.setSubscribedBy(rs.getString("SUBSCRIBED_BY"));
+ subscriptionEntity.setSubscribedTimestamp(rs.getTimestamp("SUBSCRIBED_TIMESTAMP"));
+ subscriptionEntity.setUnsubscribed(rs.getBoolean("UNSUBSCRIBED"));
+ subscriptionEntity.setUnsubscribedBy(rs.getString("UNSUBSCRIBED_BY"));
+ subscriptionEntity.setUnsubscribedTimestamp(rs.getTimestamp("UNSUBSCRIBED_TIMESTAMP"));
+ subscriptionEntity.setApplicationReleaseId(rs.getInt("AP_APP_RELEASE_ID"));
+
+ subscriptionEntities.add(subscriptionEntity);
+ }
+ }
+ return subscriptionEntities;
+ }
+ } catch (DBConnectionException e) {
+ String msg = "Error occurred while obtaining the DB connection to get groups for the given UUID.";
+ log.error(msg, e);
+ throw new ApplicationManagementDAOException(msg, e);
+ } catch (SQLException e) {
+ String msg = "SQL Error occurred while getting groups for the given UUID.";
+ log.error(msg, e);
+ throw new ApplicationManagementDAOException(msg, e);
+ }
+ }
+
+ @Override
+ public List getAllSubscriptionsDetails(int appReleaseId, boolean unsubscribe, int tenantId,
+ List actionStatus, String actionType, String actionTriggeredBy,
+ int offset, int limit) throws ApplicationManagementDAOException {
+ if (log.isDebugEnabled()) {
+ log.debug("Getting device subscriptions for the application release id " + appReleaseId + " from the database");
+ }
+ String subscriptionStatusTime = unsubscribe ? "DS.UNSUBSCRIBED_TIMESTAMP" : "DS.SUBSCRIBED_TIMESTAMP";
+ String actionTriggeredColumn = unsubscribe ? "DS.UNSUBSCRIBED_BY" : "DS.SUBSCRIBED_BY";
+ StringBuilder sql = new StringBuilder("SELECT "
+ + "DS.ID AS ID, "
+ + "DS.SUBSCRIBED_BY AS SUBSCRIBED_BY, "
+ + "DS.SUBSCRIBED_TIMESTAMP AS SUBSCRIBED_AT, "
+ + "DS.UNSUBSCRIBED AS IS_UNSUBSCRIBED, "
+ + "DS.UNSUBSCRIBED_BY AS UNSUBSCRIBED_BY, "
+ + "DS.UNSUBSCRIBED_TIMESTAMP AS UNSUBSCRIBED_AT, "
+ + "DS.ACTION_TRIGGERED_FROM AS ACTION_TRIGGERED_FROM, "
+ + "DS.STATUS AS STATUS, "
+ + "DS.DM_DEVICE_ID AS DEVICE_ID "
+ + "FROM AP_DEVICE_SUBSCRIPTION DS "
+ + "WHERE DS.AP_APP_RELEASE_ID = ? "
+ + "AND DS.UNSUBSCRIBED = ? "
+ + "AND DS.TENANT_ID = ? ");
+ if (actionStatus != null && !actionStatus.isEmpty()) {
+ sql.append(" AND DS.STATUS IN (")
+ .append(actionStatus.stream().map(status -> "?").collect(Collectors.joining(","))).append(") ");
+ }
+ if (actionType != null && !actionType.isEmpty()) {
+ sql.append(" AND DS.ACTION_TRIGGERED_FROM = ? ");
+ }
+ if (actionTriggeredBy != null && !actionTriggeredBy.isEmpty()) {
+ sql.append(" AND ").append(actionTriggeredColumn).append(" LIKE ? ");
+ }
+ sql.append("ORDER BY ").append(subscriptionStatusTime).append(" DESC ");
+ if (limit >= 0 && offset >= 0) {
+ sql.append("OFFSET ? ROWS FETCH NEXT ? ROWS ONLY");
+ }
+ try {
+ Connection conn = this.getDBConnection();
+ try (PreparedStatement ps = conn.prepareStatement(sql.toString())) {
+ int paramIdx = 1;
+ ps.setInt(paramIdx++, appReleaseId);
+ ps.setBoolean(paramIdx++, unsubscribe);
+ ps.setInt(paramIdx++, tenantId);
+ if (actionStatus != null && !actionStatus.isEmpty()) {
+ for (String status : actionStatus) {
+ ps.setString(paramIdx++, status);
+ }
+ }
+ if (actionType != null && !actionType.isEmpty()) {
+ ps.setString(paramIdx++, actionType);
+ }
+ if (actionTriggeredBy != null && !actionTriggeredBy.isEmpty()) {
+ ps.setString(paramIdx++, "%" + actionTriggeredBy + "%");
+ }
+ if (limit >= 0 && offset >= 0) {
+ ps.setInt(paramIdx++, offset);
+ ps.setInt(paramIdx, limit);
+ }
+ try (ResultSet rs = ps.executeQuery()) {
+ if (log.isDebugEnabled()) {
+ log.debug("Successfully retrieved device subscriptions for application release id "
+ + appReleaseId);
+ }
+ List deviceSubscriptions = new ArrayList<>();
+ while (rs.next()) {
+ DeviceSubscriptionDTO subscription = new DeviceSubscriptionDTO();
+ subscription.setId(rs.getInt("ID"));
+ subscription.setSubscribedBy(rs.getString("SUBSCRIBED_BY"));
+ subscription.setSubscribedTimestamp(rs.getTimestamp("SUBSCRIBED_AT"));
+ subscription.setUnsubscribed(rs.getBoolean("IS_UNSUBSCRIBED"));
+ subscription.setUnsubscribedBy(rs.getString("UNSUBSCRIBED_BY"));
+ subscription.setUnsubscribedTimestamp(rs.getTimestamp("UNSUBSCRIBED_AT"));
+ subscription.setActionTriggeredFrom(rs.getString("ACTION_TRIGGERED_FROM"));
+ subscription.setStatus(rs.getString("STATUS"));
+ subscription.setDeviceId(rs.getInt("DEVICE_ID"));
+
+ deviceSubscriptions.add(subscription);
+ }
+ return deviceSubscriptions;
+ }
+ }
+ } catch (DBConnectionException e) {
+ String msg = "Error occurred while obtaining the DB connection for getting device subscription for application Id: "
+ + appReleaseId + ".";
+ log.error(msg, e);
+ throw new ApplicationManagementDAOException(msg, e);
+ } catch (SQLException e) {
+ String msg = "Error occurred while running SQL to get device subscription data for application ID: " + appReleaseId;
+ log.error(msg, e);
+ throw new ApplicationManagementDAOException(msg, e);
+ }
+ }
}
diff --git a/components/application-mgt/io.entgra.device.mgt.core.application.mgt.core/src/main/java/io/entgra/device/mgt/core/application/mgt/core/impl/SubscriptionManagerImpl.java b/components/application-mgt/io.entgra.device.mgt.core.application.mgt.core/src/main/java/io/entgra/device/mgt/core/application/mgt/core/impl/SubscriptionManagerImpl.java
index 26322ae7dd..0c5b4057ff 100644
--- a/components/application-mgt/io.entgra.device.mgt.core.application.mgt.core/src/main/java/io/entgra/device/mgt/core/application/mgt/core/impl/SubscriptionManagerImpl.java
+++ b/components/application-mgt/io.entgra.device.mgt.core.application.mgt.core/src/main/java/io/entgra/device/mgt/core/application/mgt/core/impl/SubscriptionManagerImpl.java
@@ -24,17 +24,17 @@ import io.entgra.device.mgt.core.application.mgt.common.ApplicationSubscriptionI
import io.entgra.device.mgt.core.application.mgt.common.ApplicationType;
import io.entgra.device.mgt.core.application.mgt.common.CategorizedSubscriptionResult;
import io.entgra.device.mgt.core.application.mgt.common.DeviceSubscriptionData;
+import io.entgra.device.mgt.core.application.mgt.common.SubscriptionInfo;
+import io.entgra.device.mgt.core.application.mgt.common.SubscriptionResponse;
+import io.entgra.device.mgt.core.application.mgt.common.SubscriptionStatistics;
import io.entgra.device.mgt.core.application.mgt.common.dto.CategorizedSubscriptionCountsDTO;
import io.entgra.device.mgt.core.application.mgt.common.dto.DeviceSubscriptionDTO;
-import io.entgra.device.mgt.core.application.mgt.common.dto.SubscriptionsDTO;
import io.entgra.device.mgt.core.application.mgt.common.dto.DeviceOperationDTO;
-import io.entgra.device.mgt.core.application.mgt.common.dto.DeviceSubscriptionResponseDTO;
import io.entgra.device.mgt.core.application.mgt.common.DeviceTypes;
import io.entgra.device.mgt.core.application.mgt.common.ExecutionStatus;
import io.entgra.device.mgt.core.application.mgt.common.SubAction;
import io.entgra.device.mgt.core.application.mgt.common.SubscribingDeviceIdHolder;
import io.entgra.device.mgt.core.application.mgt.common.SubscriptionType;
-import io.entgra.device.mgt.core.application.mgt.common.dto.GroupSubscriptionDTO;
import io.entgra.device.mgt.core.application.mgt.common.dto.ApplicationReleaseDTO;
import io.entgra.device.mgt.core.application.mgt.common.dto.ScheduledSubscriptionDTO;
import io.entgra.device.mgt.core.application.mgt.common.dto.ApplicationDTO;
@@ -45,15 +45,13 @@ import io.entgra.device.mgt.core.application.mgt.common.services.VPPApplicationM
import io.entgra.device.mgt.core.application.mgt.core.dao.ApplicationReleaseDAO;
import io.entgra.device.mgt.core.application.mgt.core.dao.VppApplicationDAO;
import io.entgra.device.mgt.core.application.mgt.core.exception.BadRequestException;
+import io.entgra.device.mgt.core.application.mgt.core.util.subscription.mgt.SubscriptionManagementServiceProvider;
+import io.entgra.device.mgt.core.application.mgt.core.util.subscription.mgt.service.SubscriptionManagementHelperService;
import io.entgra.device.mgt.core.device.mgt.common.PaginationRequest;
import io.entgra.device.mgt.core.device.mgt.common.PaginationResult;
-import io.entgra.device.mgt.core.device.mgt.core.dto.DeviceDetailsDTO;
-import io.entgra.device.mgt.core.device.mgt.core.dto.GroupDetailsDTO;
import io.entgra.device.mgt.core.device.mgt.core.DeviceManagementConstants;
import io.entgra.device.mgt.core.application.mgt.core.exception.UnexpectedServerErrorException;
-import io.entgra.device.mgt.core.device.mgt.core.dao.DeviceManagementDAOException;
import io.entgra.device.mgt.core.device.mgt.core.dto.OperationDTO;
-import io.entgra.device.mgt.core.device.mgt.core.dto.OwnerWithDeviceDTO;
import io.entgra.device.mgt.core.device.mgt.extensions.logger.spi.EntgraLogger;
import io.entgra.device.mgt.core.notification.logger.AppInstallLogContext;
import io.entgra.device.mgt.core.notification.logger.impl.EntgraAppInstallLoggerImpl;
@@ -115,7 +113,6 @@ import io.entgra.device.mgt.core.device.mgt.core.util.MDMIOSOperationUtil;
import io.entgra.device.mgt.core.device.mgt.core.util.MDMWindowsOperationUtil;
import io.entgra.device.mgt.core.identity.jwt.client.extension.dto.AccessTokenInfo;
import org.wso2.carbon.user.api.UserStoreException;
-import org.wso2.carbon.user.api.UserStoreManager;
import javax.ws.rs.core.MediaType;
import java.io.BufferedReader;
@@ -132,7 +129,6 @@ import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.util.ArrayList;
import java.util.Arrays;
-import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
@@ -140,7 +136,6 @@ import java.util.Map;
import java.util.Properties;
import java.util.Set;
import java.util.concurrent.atomic.AtomicBoolean;
-import java.util.function.Function;
import java.util.stream.Collectors;
/**
@@ -1733,1071 +1728,48 @@ public class SubscriptionManagerImpl implements SubscriptionManager {
}
}
+ /**
+ * Get subscription data describes by {@link SubscriptionInfo} entity
+ * @param subscriptionInfo {@link SubscriptionInfo}
+ * @param limit Limit value
+ * @param offset Offset value
+ * @return {@link SubscriptionResponse}
+ * @throws ApplicationManagementException Throws when error encountered while getting subscription data
+ */
@Override
- public List getGroupsSubscriptionDetailsByUUID(
- String uuid, String subscriptionStatus, PaginationRequest request, int offset, int limit)
- throws ApplicationManagementException {
-
- int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true);
- boolean unsubscribe = subscriptionStatus.equals("unsubscribed");
-
- try {
- ConnectionManagerUtil.openDBConnection();
-
- ApplicationReleaseDTO applicationReleaseDTO = this.applicationReleaseDAO.getReleaseByUUID(uuid, tenantId);
- if (applicationReleaseDTO == null) {
- String msg = "Couldn't find an application release for application release UUID: " + uuid;
- log.error(msg);
- throw new NotFoundException(msg);
- }
- ApplicationDTO applicationDTO = this.applicationDAO.getAppWithRelatedRelease(uuid, tenantId);
- int appReleaseId = applicationReleaseDTO.getId();
- List groupDetailsWithDevices = new ArrayList<>();
-
- List groupDetails =
- subscriptionDAO.getGroupsSubscriptionDetailsByAppReleaseID(appReleaseId, unsubscribe, tenantId, offset, limit);
- if (groupDetails == null) {
- throw new ApplicationManagementException("Group details not found for appReleaseId: " + appReleaseId);
- }
-
- GroupManagementProviderService groupManagementProviderService = HelperUtil.getGroupManagementProviderService();
-
- for (GroupSubscriptionDTO groupDetail : groupDetails) {
-
- if (StringUtils.isNotBlank(request.getGroupName()) && !request.getGroupName().equals(groupDetail.getGroupName())) {
- continue;
- }
-
- String groupName = StringUtils.isNotBlank(request.getGroupName()) ? request.getGroupName() : groupDetail.getGroupName();
-
- // Retrieve group details and device IDs for the group using the service layer
- GroupDetailsDTO groupDetailWithDevices =
- groupManagementProviderService.getGroupDetailsWithDevices(
- groupName, applicationDTO.getDeviceTypeId(), request.getOwner(),
- request.getDeviceName(), request.getDeviceStatus(), offset, limit);
-
- SubscriptionsDTO groupDetailDTO = new SubscriptionsDTO();
- groupDetailDTO.setId(groupDetailWithDevices.getGroupId());
- groupDetailDTO.setName(groupDetail.getGroupName());
- groupDetailDTO.setOwner(groupDetailWithDevices.getGroupOwner());
- groupDetailDTO.setSubscribedBy(groupDetail.getSubscribedBy());
- groupDetailDTO.setSubscribedTimestamp(groupDetail.getSubscribedTimestamp());
- groupDetailDTO.setUnsubscribed(groupDetail.isUnsubscribed());
- groupDetailDTO.setUnsubscribedBy(groupDetail.getUnsubscribedBy());
- groupDetailDTO.setUnsubscribedTimestamp(groupDetail.getUnsubscribedTimestamp());
- groupDetailDTO.setAppReleaseId(groupDetail.getAppReleaseId());
- groupDetailDTO.setDeviceCount(groupDetailWithDevices.getDeviceCount());
-
- // Fetch device subscriptions for each device ID in the group
- List pendingDevices = new ArrayList<>();
- List installedDevices = new ArrayList<>();
- List errorDevices = new ArrayList<>();
- List newDevices = new ArrayList<>();
- List subscribedDevices = new ArrayList<>();
-
- List deviceIds = groupDetailWithDevices.getDeviceIds();
- Map statusCounts = new HashMap<>();
- statusCounts.put("COMPLETED", 0);
- statusCounts.put("ERROR", 0);
- statusCounts.put("PENDING", 0);
- statusCounts.put("NEW", 0);
- statusCounts.put("SUBSCRIBED", 0);
-
- for (Integer deviceId : deviceIds) {
- // Get subscribed devices if unsubscribed devices are requested
- List deviceSubscriptions;
- if (unsubscribe) {
- deviceSubscriptions = subscriptionDAO.getSubscriptionDetailsByDeviceIds(
- appReleaseId, !unsubscribe, tenantId, deviceIds,
- request.getActionStatus(), request.getActionType(), request.getActionTriggeredBy(), request.getTabActionStatus());
- } else {
- deviceSubscriptions = subscriptionDAO.getSubscriptionDetailsByDeviceIds(
- groupDetail.getAppReleaseId(), false, tenantId, deviceIds,
- request.getActionStatus(), request.getActionType(), request.getActionTriggeredBy(), request.getTabActionStatus());
- }
- List filteredDeviceSubscriptions = deviceSubscriptions.stream()
- .filter(subscription -> StringUtils.isBlank(request.getTabActionStatus()) || subscription.getStatus().equals(request.getTabActionStatus()))
- .collect(Collectors.toList());
- boolean isNewDevice = true;
- for (DeviceSubscriptionDTO subscription : filteredDeviceSubscriptions) {
- if (subscription.getDeviceId() == deviceId) {
- DeviceSubscriptionData deviceDetail = new DeviceSubscriptionData();
- deviceDetail.setDeviceId(subscription.getDeviceId());
- deviceDetail.setStatus(subscription.getStatus());
- deviceDetail.setActionType(subscription.getActionTriggeredFrom());
- deviceDetail.setDeviceOwner(groupDetailWithDevices.getDeviceOwners().get(deviceId));
- deviceDetail.setDeviceStatus(groupDetailWithDevices.getDeviceStatuses().get(deviceId));
- deviceDetail.setDeviceName(groupDetailWithDevices.getDeviceNames().get(deviceId));
- deviceDetail.setSubId(subscription.getId());
- deviceDetail.setActionTriggeredBy(subscription.getSubscribedBy());
- deviceDetail.setActionTriggeredTimestamp(subscription.getSubscribedTimestamp());
- deviceDetail.setUnsubscribed(subscription.isUnsubscribed());
- deviceDetail.setUnsubscribedBy(subscription.getUnsubscribedBy());
- deviceDetail.setUnsubscribedTimestamp(subscription.getUnsubscribedTimestamp());
- deviceDetail.setType(groupDetailWithDevices.getDeviceTypes().get(deviceId));
- deviceDetail.setDeviceIdentifier(groupDetailWithDevices.getDeviceIdentifiers().get(deviceId));
-
- String status = subscription.getStatus();
- switch (status) {
- case "COMPLETED":
- installedDevices.add(deviceDetail);
- statusCounts.put("COMPLETED", statusCounts.get("COMPLETED") + 1);
- break;
- case "ERROR":
- case "INVALID":
- case "UNAUTHORIZED":
- errorDevices.add(deviceDetail);
- statusCounts.put("ERROR", statusCounts.get("ERROR") + 1);
- break;
- case "IN_PROGRESS":
- case "PENDING":
- case "REPEATED":
- pendingDevices.add(deviceDetail);
- statusCounts.put("PENDING", statusCounts.get("PENDING") + 1);
- break;
- default:
- newDevices.add(deviceDetail);
- statusCounts.put("NEW", statusCounts.get("NEW") + 1);
- break;
- }
- isNewDevice = false;
- }
- }
- if (isNewDevice) {
- boolean isSubscribedDevice = false;
- for (DeviceSubscriptionDTO subscribedDevice : deviceSubscriptions) {
- if (subscribedDevice.getDeviceId() == deviceId) {
- DeviceSubscriptionData subscribedDeviceDetail = new DeviceSubscriptionData();
- subscribedDeviceDetail.setDeviceId(subscribedDevice.getDeviceId());
- subscribedDeviceDetail.setDeviceOwner(groupDetailWithDevices.getDeviceOwners().get(deviceId));
- subscribedDeviceDetail.setDeviceStatus(groupDetailWithDevices.getDeviceStatuses().get(deviceId));
- subscribedDeviceDetail.setDeviceName(groupDetailWithDevices.getDeviceNames().get(deviceId));
- subscribedDeviceDetail.setSubId(subscribedDevice.getId());
- subscribedDeviceDetail.setActionTriggeredBy(subscribedDevice.getSubscribedBy());
- subscribedDeviceDetail.setActionTriggeredTimestamp(subscribedDevice.getSubscribedTimestamp());
- subscribedDeviceDetail.setActionType(subscribedDevice.getActionTriggeredFrom());
- subscribedDeviceDetail.setStatus(subscribedDevice.getStatus());
- subscribedDeviceDetail.setType(groupDetailWithDevices.getDeviceTypes().get(deviceId));
- subscribedDeviceDetail.setDeviceIdentifier(groupDetailWithDevices.getDeviceIdentifiers().get(deviceId));
- subscribedDevices.add(subscribedDeviceDetail);
- statusCounts.put("SUBSCRIBED", statusCounts.get("SUBSCRIBED") + 1);
- isSubscribedDevice = true;
- break;
- }
- }
- if (!isSubscribedDevice) {
- DeviceSubscriptionData newDeviceDetail = new DeviceSubscriptionData();
- newDeviceDetail.setDeviceId(deviceId);
- newDeviceDetail.setDeviceOwner(groupDetailWithDevices.getDeviceOwners().get(deviceId));
- newDeviceDetail.setDeviceStatus(groupDetailWithDevices.getDeviceStatuses().get(deviceId));
- newDeviceDetail.setDeviceName(groupDetailWithDevices.getDeviceNames().get(deviceId));
- newDeviceDetail.setType(groupDetailWithDevices.getDeviceTypes().get(deviceId));
- newDeviceDetail.setDeviceIdentifier(groupDetailWithDevices.getDeviceIdentifiers().get(deviceId));
- newDevices.add(newDeviceDetail);
- statusCounts.put("NEW", statusCounts.get("NEW") + 1);
- }
- }
- }
-
- int totalDevices = deviceIds.size();
- Map statusPercentages = new HashMap<>();
- for (Map.Entry entry : statusCounts.entrySet()) {
- double percentage = ((double) entry.getValue() / totalDevices) * 100;
- String formattedPercentage = String.format("%.2f", percentage);
- statusPercentages.put(entry.getKey(), Double.valueOf(formattedPercentage));
- }
-
- List requestedDevices = new ArrayList<>();
- if (StringUtils.isNotBlank(request.getTabActionStatus())) {
- switch (request.getTabActionStatus()) {
- case "COMPLETED":
- requestedDevices = installedDevices;
- break;
- case "PENDING":
- requestedDevices = pendingDevices;
- break;
- case "ERROR":
- requestedDevices = errorDevices;
- break;
- case "NEW":
- requestedDevices = newDevices;
- break;
- case "SUBSCRIBED":
- requestedDevices = subscribedDevices;
- break;
- }
- groupDetailDTO.setDevices(new CategorizedSubscriptionResult(requestedDevices, request.getTabActionStatus()));
- } else {
- CategorizedSubscriptionResult categorizedSubscriptionResult;
- if (subscribedDevices.isEmpty()) {
- categorizedSubscriptionResult =
- new CategorizedSubscriptionResult(installedDevices, pendingDevices, errorDevices, newDevices);
- } else {
- categorizedSubscriptionResult =
- new CategorizedSubscriptionResult(installedDevices, pendingDevices, errorDevices, newDevices, subscribedDevices);
- }
- groupDetailDTO.setDevices(categorizedSubscriptionResult);
- }
- groupDetailDTO.setStatusPercentages(statusPercentages);
- groupDetailsWithDevices.add(groupDetailDTO);
- }
-
- return groupDetailsWithDevices;
- } catch (ApplicationManagementDAOException e) {
- String msg = "Error occurred while fetching groups and devices for UUID: " + uuid;
- log.error(msg, e);
- throw new ApplicationManagementException(msg, e);
- } catch (DBConnectionException e) {
- String msg = "DB Connection error occurred while fetching groups and devices for UUID: " + uuid;
- log.error(msg, e);
- throw new ApplicationManagementException(msg, e);
- } catch (GroupManagementException e) {
- String msg = "Error occurred while fetching group details and device IDs: " + e.getMessage();
- log.error(msg, e);
- throw new ApplicationManagementException(msg, e);
- } finally {
- ConnectionManagerUtil.closeDBConnection();
- }
- }
-
- @Override
- public List getUserSubscriptionsByUUID(String uuid, String subscriptionStatus,
- PaginationRequest request, int offset, int limit)
+ public SubscriptionResponse getSubscriptions(SubscriptionInfo subscriptionInfo, int limit, int offset)
throws ApplicationManagementException {
- int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true);
- boolean unsubscribe = subscriptionStatus.equals("unsubscribed");
- String status;
-
- try {
- ConnectionManagerUtil.openDBConnection();
-
- ApplicationReleaseDTO applicationReleaseDTO = this.applicationReleaseDAO.getReleaseByUUID(uuid, tenantId);
- if (applicationReleaseDTO == null) {
- String msg = "Couldn't find an application release for application release UUID: " + uuid;
- log.error(msg);
- throw new NotFoundException(msg);
- }
- ApplicationDTO applicationDTO = this.applicationDAO.getAppWithRelatedRelease(uuid, tenantId);
- int appReleaseId = applicationReleaseDTO.getId();
- List userSubscriptionsWithDevices = new ArrayList<>();
-
- List userSubscriptions =
- subscriptionDAO.getUserSubscriptionsByAppReleaseID(appReleaseId, unsubscribe, tenantId, offset, limit);
- if (userSubscriptions == null) {
- throw new ApplicationManagementException("User details not found for appReleaseId: " + appReleaseId);
- }
-
- DeviceManagementProviderService deviceManagementProviderService = HelperUtil.getDeviceManagementProviderService();
-
- for (SubscriptionsDTO userSubscription : userSubscriptions) {
-
- if (StringUtils.isNotBlank(request.getUserName()) && !request.getUserName().equals(userSubscription.getName())) {
- continue;
- }
-
- String userName = StringUtils.isNotBlank(request.getUserName()) ? request.getUserName() : userSubscription.getName();
-
- // Retrieve owner details and device IDs for the user using the service layer
- OwnerWithDeviceDTO ownerDetailsWithDevices =
- deviceManagementProviderService.getOwnersWithDeviceIds(userName, applicationDTO.getDeviceTypeId(),
- request.getOwner(), request.getDeviceName(), request.getDeviceStatus());
-
- SubscriptionsDTO userSubscriptionDTO = new SubscriptionsDTO();
- userSubscriptionDTO.setName(userSubscription.getName());
- userSubscriptionDTO.setSubscribedBy(userSubscription.getSubscribedBy());
- userSubscriptionDTO.setSubscribedTimestamp(userSubscription.getSubscribedTimestamp());
- userSubscriptionDTO.setUnsubscribed(userSubscription.getUnsubscribed());
- userSubscriptionDTO.setUnsubscribedBy(userSubscription.getUnsubscribedBy());
- userSubscriptionDTO.setUnsubscribedTimestamp(userSubscription.getUnsubscribedTimestamp());
- userSubscriptionDTO.setAppReleaseId(userSubscription.getAppReleaseId());
-
- userSubscriptionDTO.setDeviceCount(ownerDetailsWithDevices.getDeviceCount());
-
- // Fetch device subscriptions for each device ID associated with the user
- List pendingDevices = new ArrayList<>();
- List installedDevices = new ArrayList<>();
- List errorDevices = new ArrayList<>();
- List newDevices = new ArrayList<>();
- List subscribedDevices = new ArrayList<>();
-
- List deviceIds = ownerDetailsWithDevices.getDeviceIds();
- Map statusCounts = new HashMap<>();
- statusCounts.put("PENDING", 0);
- statusCounts.put("COMPLETED", 0);
- statusCounts.put("ERROR", 0);
- statusCounts.put("NEW", 0);
- statusCounts.put("SUBSCRIBED", 0);
-
- List subscribedDeviceSubscriptions = new ArrayList<>();
- if (unsubscribe) {
- subscribedDeviceSubscriptions = subscriptionDAO.getSubscriptionDetailsByDeviceIds(
- appReleaseId, !unsubscribe, tenantId, deviceIds, request.getActionStatus(), request.getActionType(),
- request.getActionTriggeredBy(), request.getTabActionStatus());
- }
-
- for (Integer deviceId : deviceIds) {
- List deviceSubscriptions = subscriptionDAO.getSubscriptionDetailsByDeviceIds(
- userSubscription.getAppReleaseId(), unsubscribe, tenantId, deviceIds, request.getActionStatus(), request.getActionType(),
- request.getActionTriggeredBy(), request.getTabActionStatus());
- OwnerWithDeviceDTO ownerWithDeviceByDeviceId =
- deviceManagementProviderService.getOwnerWithDeviceByDeviceId(deviceId, request.getOwner(), request.getDeviceName(),
- request.getDeviceStatus());
- if (ownerWithDeviceByDeviceId == null) {
- continue;
- }
- boolean isNewDevice = true;
- for (DeviceSubscriptionDTO subscription : deviceSubscriptions) {
- if (subscription.getDeviceId() == deviceId) {
- DeviceSubscriptionData deviceDetail = new DeviceSubscriptionData();
- deviceDetail.setDeviceId(subscription.getDeviceId());
- deviceDetail.setSubId(subscription.getId());
- deviceDetail.setDeviceOwner(ownerWithDeviceByDeviceId.getUserName());
- deviceDetail.setDeviceStatus(ownerWithDeviceByDeviceId.getDeviceStatus());
- deviceDetail.setDeviceName(ownerWithDeviceByDeviceId.getDeviceNames());
- deviceDetail.setActionType(subscription.getActionTriggeredFrom());
- deviceDetail.setStatus(subscription.getStatus());
- deviceDetail.setActionType(subscription.getActionTriggeredFrom());
- deviceDetail.setActionTriggeredBy(subscription.getSubscribedBy());
- deviceDetail.setActionTriggeredTimestamp(subscription.getSubscribedTimestamp());
- deviceDetail.setUnsubscribed(subscription.isUnsubscribed());
- deviceDetail.setUnsubscribedBy(subscription.getUnsubscribedBy());
- deviceDetail.setUnsubscribedTimestamp(subscription.getUnsubscribedTimestamp());
- deviceDetail.setType(ownerWithDeviceByDeviceId.getDeviceTypes());
- deviceDetail.setDeviceIdentifier(ownerWithDeviceByDeviceId.getDeviceIdentifiers());
-
- status = subscription.getStatus();
- switch (status) {
- case "COMPLETED":
- installedDevices.add(deviceDetail);
- statusCounts.put("COMPLETED", statusCounts.get("COMPLETED") + 1);
- break;
- case "ERROR":
- case "INVALID":
- case "UNAUTHORIZED":
- errorDevices.add(deviceDetail);
- statusCounts.put("ERROR", statusCounts.get("ERROR") + 1);
- break;
- case "IN_PROGRESS":
- case "PENDING":
- case "REPEATED":
- pendingDevices.add(deviceDetail);
- statusCounts.put("PENDING", statusCounts.get("PENDING") + 1);
- break;
- }
- isNewDevice = false;
- }
- }
- if (isNewDevice) {
- boolean isSubscribedDevice = false;
- for (DeviceSubscriptionDTO subscribedDevice : subscribedDeviceSubscriptions) {
- if (subscribedDevice.getDeviceId() == deviceId) {
- DeviceSubscriptionData subscribedDeviceDetail = new DeviceSubscriptionData();
- subscribedDeviceDetail.setDeviceId(subscribedDevice.getDeviceId());
- subscribedDeviceDetail.setDeviceName(ownerWithDeviceByDeviceId.getDeviceNames());
- subscribedDeviceDetail.setDeviceOwner(ownerWithDeviceByDeviceId.getUserName());
- subscribedDeviceDetail.setDeviceStatus(ownerWithDeviceByDeviceId.getDeviceStatus());
- subscribedDeviceDetail.setSubId(subscribedDevice.getId());
- subscribedDeviceDetail.setActionTriggeredBy(subscribedDevice.getSubscribedBy());
- subscribedDeviceDetail.setActionTriggeredTimestamp(subscribedDevice.getSubscribedTimestamp());
- subscribedDeviceDetail.setActionType(subscribedDevice.getActionTriggeredFrom());
- subscribedDeviceDetail.setStatus(subscribedDevice.getStatus());
- subscribedDeviceDetail.setType(ownerWithDeviceByDeviceId.getDeviceTypes());
- subscribedDeviceDetail.setDeviceIdentifier(ownerWithDeviceByDeviceId.getDeviceIdentifiers());
- subscribedDevices.add(subscribedDeviceDetail);
- statusCounts.put("SUBSCRIBED", statusCounts.get("SUBSCRIBED") + 1);
- isSubscribedDevice = true;
- break;
- }
- }
- if (!isSubscribedDevice) {
- DeviceSubscriptionData newDeviceDetail = new DeviceSubscriptionData();
- newDeviceDetail.setDeviceId(deviceId);
- newDeviceDetail.setDeviceOwner(ownerWithDeviceByDeviceId.getUserName());
- newDeviceDetail.setDeviceStatus(ownerWithDeviceByDeviceId.getDeviceStatus());
- newDeviceDetail.setDeviceName(ownerWithDeviceByDeviceId.getDeviceNames());
- newDeviceDetail.setType(ownerWithDeviceByDeviceId.getDeviceTypes());
- newDeviceDetail.setDeviceIdentifier(ownerWithDeviceByDeviceId.getDeviceIdentifiers());
- newDevices.add(newDeviceDetail);
- statusCounts.put("NEW", statusCounts.get("NEW") + 1);
- }
- }
- }
-
- int totalDevices = deviceIds.size();
- Map statusPercentages = new HashMap<>();
- for (Map.Entry entry : statusCounts.entrySet()) {
- double percentage = ((double) entry.getValue() / totalDevices) * 100;
- String formattedPercentage = String.format("%.2f", percentage);
- statusPercentages.put(entry.getKey(), Double.valueOf(formattedPercentage));
- }
-
- List requestedDevices = new ArrayList<>();
- if (StringUtils.isNotBlank(request.getTabActionStatus())) {
- switch (request.getTabActionStatus()) {
- case "COMPLETED":
- requestedDevices = installedDevices;
- break;
- case "PENDING":
- requestedDevices = pendingDevices;
- break;
- case "ERROR":
- requestedDevices = errorDevices;
- break;
- case "NEW":
- requestedDevices = newDevices;
- break;
- case "SUBSCRIBED":
- requestedDevices = subscribedDevices;
- break;
- }
- userSubscriptionDTO.setDevices(new CategorizedSubscriptionResult(requestedDevices, request.getTabActionStatus()));
- } else {
- CategorizedSubscriptionResult categorizedSubscriptionResult;
- if (subscribedDevices.isEmpty()) {
- categorizedSubscriptionResult =
- new CategorizedSubscriptionResult(installedDevices, pendingDevices, errorDevices, newDevices);
- } else {
- categorizedSubscriptionResult =
- new CategorizedSubscriptionResult(installedDevices, pendingDevices, errorDevices, newDevices,
- subscribedDevices);
- }
- userSubscriptionDTO.setDevices(categorizedSubscriptionResult);
- userSubscriptionDTO.setStatusPercentages(statusPercentages);
-
- }
- userSubscriptionsWithDevices.add(userSubscriptionDTO);
- }
- return userSubscriptionsWithDevices;
- } catch (ApplicationManagementDAOException e) {
- String msg = "Error occurred while getting user subscriptions for the application release UUID: " + uuid;
- log.error(msg, e);
- throw new ApplicationManagementException(msg, e);
- } catch (DBConnectionException e) {
- String msg = "DB Connection error occurred while getting user subscriptions for UUID: " + uuid;
- log.error(msg, e);
- throw new ApplicationManagementException(msg, e);
- } catch (DeviceManagementDAOException e) {
- throw new RuntimeException(e);
- } finally {
- ConnectionManagerUtil.closeDBConnection();
- }
+ SubscriptionManagementHelperService subscriptionManagementHelperService =
+ SubscriptionManagementServiceProvider.getInstance().getSubscriptionManagementHelperService(subscriptionInfo);
+ return subscriptionManagementHelperService.getSubscriptions(subscriptionInfo, limit, offset);
}
+ /**
+ * Get status based subscription data describes by {@link SubscriptionInfo} entity
+ * @param subscriptionInfo {@link SubscriptionInfo}
+ * @param limit Limit value
+ * @param offset Offset value
+ * @return {@link SubscriptionResponse}
+ * @throws ApplicationManagementException Throws when error encountered while getting subscription data
+ */
@Override
- public List getRoleSubscriptionsByUUID(String uuid, String subscriptionStatus,
- PaginationRequest request, int offset, int limit)
+ public SubscriptionResponse getStatusBaseSubscriptions(SubscriptionInfo subscriptionInfo, int limit, int offset)
throws ApplicationManagementException {
- int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true);
- boolean unsubscribe = subscriptionStatus.equals("unsubscribed");
- String roleName;
- String status;
-
- try {
- ConnectionManagerUtil.openDBConnection();
-
- ApplicationReleaseDTO applicationReleaseDTO = this.applicationReleaseDAO.getReleaseByUUID(uuid, tenantId);
- if (applicationReleaseDTO == null) {
- String msg = "Couldn't find an application release for application release UUID: " + uuid;
- log.error(msg);
- throw new NotFoundException(msg);
- }
- ApplicationDTO applicationDTO = this.applicationDAO.getAppWithRelatedRelease(uuid, tenantId);
- int appReleaseId = applicationReleaseDTO.getId();
- List roleSubscriptionsWithDevices = new ArrayList<>();
-
- List roleSubscriptions =
- subscriptionDAO.getRoleSubscriptionsByAppReleaseID(appReleaseId, unsubscribe, tenantId, offset, limit);
- if (roleSubscriptions == null) {
- throw new ApplicationManagementException("Role details not found for appReleaseId: " + appReleaseId);
- }
-
- DeviceManagementProviderService deviceManagementProviderService = HelperUtil.getDeviceManagementProviderService();
-
- for (SubscriptionsDTO roleSubscription : roleSubscriptions) {
-
- roleName = StringUtils.isNotBlank(request.getRoleName()) ? request.getRoleName() : roleSubscription.getName();
-
- SubscriptionsDTO roleSubscriptionDTO = new SubscriptionsDTO();
- roleSubscriptionDTO.setName(roleSubscription.getName());
- roleSubscriptionDTO.setSubscribedBy(roleSubscription.getSubscribedBy());
- roleSubscriptionDTO.setSubscribedTimestamp(roleSubscription.getSubscribedTimestamp());
- roleSubscriptionDTO.setUnsubscribed(roleSubscription.getUnsubscribed());
- roleSubscriptionDTO.setUnsubscribedBy(roleSubscription.getUnsubscribedBy());
- roleSubscriptionDTO.setUnsubscribedTimestamp(roleSubscription.getUnsubscribedTimestamp());
- roleSubscriptionDTO.setAppReleaseId(roleSubscription.getAppReleaseId());
-
- List pendingDevices = new ArrayList<>();
- List installedDevices = new ArrayList<>();
- List errorDevices = new ArrayList<>();
- List newDevices = new ArrayList<>();
- List subscribedDevices = new ArrayList<>();
-
- Map statusCounts = new HashMap<>();
- statusCounts.put("PENDING", 0);
- statusCounts.put("COMPLETED", 0);
- statusCounts.put("ERROR", 0);
- statusCounts.put("NEW", 0);
- statusCounts.put("SUBSCRIBED", 0);
-
- List users = this.getUsersForRole(roleName);
-
- for (String user : users) {
- OwnerWithDeviceDTO ownerDetailsWithDevices;
- try {
- ownerDetailsWithDevices = deviceManagementProviderService.getOwnersWithDeviceIds(user, applicationDTO.getDeviceTypeId(),
- request.getOwner(), request.getDeviceName(), request.getDeviceStatus());
- } catch (DeviceManagementDAOException e) {
- throw new ApplicationManagementException("Error retrieving owner details with devices for user: " + user, e);
- }
-
- List deviceIds = ownerDetailsWithDevices.getDeviceIds();
- for (Integer deviceId : deviceIds) {
-
- List subscribedDeviceSubscriptions = new ArrayList<>();
- if (unsubscribe) {
- subscribedDeviceSubscriptions = subscriptionDAO.getSubscriptionDetailsByDeviceIds(
- appReleaseId, !unsubscribe, tenantId, deviceIds, request.getActionStatus(), request.getActionType(),
- request.getActionTriggeredBy(), request.getTabActionStatus());
- }
- OwnerWithDeviceDTO ownerWithDeviceByDeviceId =
- deviceManagementProviderService.getOwnerWithDeviceByDeviceId(deviceId, request.getOwner(), request.getDeviceName(),
- request.getDeviceStatus());
- if (ownerWithDeviceByDeviceId == null) {
- continue;
- }
- List deviceSubscriptions;
- try {
- deviceSubscriptions = subscriptionDAO.getSubscriptionDetailsByDeviceIds(
- roleSubscription.getAppReleaseId(), unsubscribe, tenantId, deviceIds, request.getActionStatus(),
- request.getActionType(), request.getActionTriggeredBy(), request.getTabActionStatus());
- } catch (ApplicationManagementDAOException e) {
- throw new ApplicationManagementException("Error retrieving device subscriptions", e);
- }
-
- boolean isNewDevice = true;
- for (DeviceSubscriptionDTO deviceSubscription : deviceSubscriptions) {
- if (deviceSubscription.getDeviceId() == deviceId) {
- DeviceSubscriptionData deviceDetail = new DeviceSubscriptionData();
- deviceDetail.setDeviceId(deviceSubscription.getDeviceId());
- deviceDetail.setDeviceName(ownerWithDeviceByDeviceId.getDeviceNames());
- deviceDetail.setDeviceOwner(ownerWithDeviceByDeviceId.getUserName());
- deviceDetail.setDeviceStatus(ownerWithDeviceByDeviceId.getDeviceStatus());
- deviceDetail.setActionType(deviceSubscription.getActionTriggeredFrom());
- deviceDetail.setStatus(deviceSubscription.getStatus());
- deviceDetail.setActionType(deviceSubscription.getActionTriggeredFrom());
- deviceDetail.setActionTriggeredBy(deviceSubscription.getSubscribedBy());
- deviceDetail.setSubId(deviceSubscription.getId());
- deviceDetail.setActionTriggeredTimestamp(deviceSubscription.getSubscribedTimestamp());
- deviceDetail.setUnsubscribed(deviceSubscription.isUnsubscribed());
- deviceDetail.setUnsubscribedBy(deviceSubscription.getUnsubscribedBy());
- deviceDetail.setUnsubscribedTimestamp(deviceSubscription.getUnsubscribedTimestamp());
- deviceDetail.setType(ownerWithDeviceByDeviceId.getDeviceTypes());
- deviceDetail.setDeviceIdentifier(ownerWithDeviceByDeviceId.getDeviceIdentifiers());
-
- status = deviceSubscription.getStatus();
- switch (status) {
- case "COMPLETED":
- installedDevices.add(deviceDetail);
- statusCounts.put("COMPLETED", statusCounts.get("COMPLETED") + 1);
- break;
- case "ERROR":
- case "INVALID":
- case "UNAUTHORIZED":
- errorDevices.add(deviceDetail);
- statusCounts.put("ERROR", statusCounts.get("ERROR") + 1);
- break;
- case "IN_PROGRESS":
- case "PENDING":
- case "REPEATED":
- pendingDevices.add(deviceDetail);
- statusCounts.put("PENDING", statusCounts.get("PENDING") + 1);
- break;
- }
- isNewDevice = false;
- }
- }
- if (isNewDevice) {
- boolean isSubscribedDevice = false;
- for (DeviceSubscriptionDTO subscribedDevice : subscribedDeviceSubscriptions) {
- if (subscribedDevice.getDeviceId() == deviceId) {
- DeviceSubscriptionData subscribedDeviceDetail = new DeviceSubscriptionData();
- subscribedDeviceDetail.setDeviceId(subscribedDevice.getDeviceId());
- subscribedDeviceDetail.setDeviceName(ownerWithDeviceByDeviceId.getDeviceNames());
- subscribedDeviceDetail.setDeviceOwner(ownerWithDeviceByDeviceId.getUserName());
- subscribedDeviceDetail.setDeviceStatus(ownerWithDeviceByDeviceId.getDeviceStatus());
- subscribedDeviceDetail.setSubId(subscribedDevice.getId());
- subscribedDeviceDetail.setActionTriggeredBy(subscribedDevice.getSubscribedBy());
- subscribedDeviceDetail.setActionTriggeredTimestamp(subscribedDevice.getSubscribedTimestamp());
- subscribedDeviceDetail.setActionType(subscribedDevice.getActionTriggeredFrom());
- subscribedDeviceDetail.setStatus(subscribedDevice.getStatus());
- subscribedDeviceDetail.setType(ownerWithDeviceByDeviceId.getDeviceTypes());
- subscribedDeviceDetail.setDeviceIdentifier(ownerWithDeviceByDeviceId.getDeviceIdentifiers());
- subscribedDevices.add(subscribedDeviceDetail);
- statusCounts.put("SUBSCRIBED", statusCounts.get("SUBSCRIBED") + 1);
- isSubscribedDevice = true;
- break;
- }
- }
- if (!isSubscribedDevice) {
- DeviceSubscriptionData newDeviceDetail = new DeviceSubscriptionData();
- newDeviceDetail.setDeviceId(deviceId);
- newDeviceDetail.setDeviceName(ownerWithDeviceByDeviceId.getDeviceNames());
- newDeviceDetail.setDeviceOwner(ownerWithDeviceByDeviceId.getUserName());
- newDeviceDetail.setDeviceStatus(ownerWithDeviceByDeviceId.getDeviceStatus());
- newDeviceDetail.setType(ownerWithDeviceByDeviceId.getDeviceTypes());
- newDeviceDetail.setDeviceIdentifier(ownerWithDeviceByDeviceId.getDeviceIdentifiers());
- newDevices.add(newDeviceDetail);
- statusCounts.put("NEW", statusCounts.get("NEW") + 1);
- }
- }
- }
- }
-
- int totalDevices =
- pendingDevices.size() + installedDevices.size() + errorDevices.size() + newDevices.size() + subscribedDevices.size();
- Map statusPercentages = new HashMap<>();
- for (Map.Entry entry : statusCounts.entrySet()) {
- double percentage = totalDevices == 0 ? 0.0 : ((double) entry.getValue() / totalDevices) * 100;
- String formattedPercentage = String.format("%.2f", percentage);
- statusPercentages.put(entry.getKey(), Double.valueOf(formattedPercentage));
- }
-
- List requestedDevices = new ArrayList<>();
- if (StringUtils.isNotBlank(request.getTabActionStatus())) {
- switch (request.getTabActionStatus()) {
- case "COMPLETED":
- requestedDevices = installedDevices;
- break;
- case "PENDING":
- requestedDevices = pendingDevices;
- break;
- case "ERROR":
- requestedDevices = errorDevices;
- break;
- case "NEW":
- requestedDevices = newDevices;
- break;
- case "SUBSCRIBED":
- requestedDevices = subscribedDevices;
- break;
- }
- roleSubscriptionDTO.setDevices(new CategorizedSubscriptionResult(requestedDevices, request.getTabActionStatus()));
-
- } else {
- CategorizedSubscriptionResult categorizedSubscriptionResult;
- if (subscribedDevices.isEmpty()) {
- categorizedSubscriptionResult =
- new CategorizedSubscriptionResult(installedDevices, pendingDevices, errorDevices, newDevices);
- } else {
- categorizedSubscriptionResult =
- new CategorizedSubscriptionResult(installedDevices, pendingDevices, errorDevices, newDevices,
- subscribedDevices);
- }
- roleSubscriptionDTO.setDevices(categorizedSubscriptionResult);
- roleSubscriptionDTO.setStatusPercentages(statusPercentages);
- roleSubscriptionDTO.setDeviceCount(totalDevices);
- }
- roleSubscriptionsWithDevices.add(roleSubscriptionDTO);
- }
-
- return roleSubscriptionsWithDevices;
- } catch (ApplicationManagementDAOException | DeviceManagementDAOException e) {
- String msg = "Error occurred in retrieving role subscriptions with devices";
- log.error(msg, e);
- throw new ApplicationManagementException(msg, e);
- } catch (DBConnectionException e) {
- String msg = "Error occurred while retrieving the database connection";
- log.error(msg, e);
- throw new ApplicationManagementException(msg, e);
- } catch (UserStoreException e) {
- String msg = "Error occurred while retrieving users for role";
- log.error(msg, e);
- throw new ApplicationManagementException(msg, e);
- } finally {
- ConnectionManagerUtil.closeDBConnection();
- }
- }
-
- // Get user list for each role
- public List getUsersForRole(String roleName) throws UserStoreException {
- PrivilegedCarbonContext ctx = PrivilegedCarbonContext.getThreadLocalCarbonContext();
- int tenantId = ctx.getTenantId();
- UserStoreManager userStoreManager = DataHolder.getInstance().getRealmService().getTenantUserRealm(tenantId).getUserStoreManager();
- String[] users = userStoreManager.getUserListOfRole(roleName);
- return Arrays.asList(users);
- }
-
- @Override
- public DeviceSubscriptionResponseDTO getDeviceSubscriptionsDetailsByUUID(String uuid, String subscriptionStatus, PaginationRequest request, int offset,
- int limit) throws ApplicationManagementException {
-
- int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true);
- boolean unsubscribe = subscriptionStatus.equals("unsubscribed");
-
- try {
- ConnectionManagerUtil.openDBConnection();
-
- ApplicationReleaseDTO applicationReleaseDTO = applicationReleaseDAO.getReleaseByUUID(uuid, tenantId);
- if (applicationReleaseDTO == null) {
- String msg = "Couldn't find an application release for application release UUID: " + uuid;
- log.error(msg);
- throw new NotFoundException(msg);
- }
- ApplicationDTO applicationDTO = this.applicationDAO.getAppWithRelatedRelease(uuid, tenantId);
- int appReleaseId = applicationReleaseDTO.getId();
-
- DeviceManagementProviderService deviceManagementProviderService = HelperUtil.getDeviceManagementProviderService();
- List deviceSubscriptions =
- subscriptionDAO.getDeviceSubscriptionsByAppReleaseID(appReleaseId, unsubscribe, tenantId, offset, limit);
-
- // empty response for no device subscriptions
- if (deviceSubscriptions.isEmpty()) {
- return new DeviceSubscriptionResponseDTO(0, Collections.emptyMap(),
- new CategorizedSubscriptionResult(Collections.emptyList(),
- Collections.emptyList(), Collections.emptyList(), Collections.emptyList()));
- }
-
- List allDevices =
- deviceManagementProviderService.getDevicesByTenantId(tenantId, applicationDTO.getDeviceTypeId(),
- request.getOwner(), request.getDeviceStatus());
-
- List deviceIds = allDevices.stream()
- .map(DeviceDetailsDTO::getDeviceId)
- .collect(Collectors.toList());
-
- Map statusCounts = new HashMap<>();
- statusCounts.put("PENDING", 0);
- statusCounts.put("COMPLETED", 0);
- statusCounts.put("ERROR", 0);
- statusCounts.put("NEW", 0);
- statusCounts.put("SUBSCRIBED", 0);
-
- List installedDevices = new ArrayList<>();
- List pendingDevices = new ArrayList<>();
- List errorDevices = new ArrayList<>();
- List newDevices = new ArrayList<>();
- List subscribedDevices = new ArrayList<>();
-
- Map deviceSubscriptionMap = deviceSubscriptions.stream()
- .collect(Collectors.toMap(DeviceSubscriptionDTO::getDeviceId, Function.identity()));
- Map allDevicesMap = allDevices.stream()
- .collect(Collectors.toMap(DeviceDetailsDTO::getDeviceId, Function.identity()));
-
- List allSubscriptionsForUnSubscribed =
- subscriptionDAO.getSubscriptionDetailsByDeviceIds(appReleaseId, !unsubscribe, tenantId, deviceIds, request.getActionStatus(),
- request.getActionType(), request.getActionTriggeredBy(), request.getTabActionStatus());
- List allSubscriptionsForSubscribed =
- subscriptionDAO.getSubscriptionDetailsByDeviceIds(appReleaseId, unsubscribe, tenantId, deviceIds, request.getActionStatus(),
- request.getActionType(), request.getActionTriggeredBy(), request.getTabActionStatus());
- Map allSubscriptionForUnSubscribedMap = allSubscriptionsForUnSubscribed.stream()
- .collect(Collectors.toMap(DeviceSubscriptionDTO::getDeviceId, Function.identity()));
- Map allSubscriptionForSubscribedMap = allSubscriptionsForSubscribed.stream()
- .collect(Collectors.toMap(DeviceSubscriptionDTO::getDeviceId, Function.identity()));
-
- for (DeviceDetailsDTO device : allDevices) {
- Integer deviceId = device.getDeviceId();
- OwnerWithDeviceDTO ownerWithDevice =
- deviceManagementProviderService.getOwnerWithDeviceByDeviceId(deviceId, request.getOwner(), request.getDeviceName(),
- request.getDeviceStatus());
- if (ownerWithDevice == null || (request.getDeviceName() != null && !request.getDeviceName().isEmpty() &&
- (ownerWithDevice.getDeviceNames() == null || !ownerWithDevice.getDeviceNames().contains(request.getDeviceName())))) {
- continue;
- }
- if (deviceSubscriptionMap.containsKey(deviceId)) {
- DeviceSubscriptionDTO subscription = deviceSubscriptionMap.get(deviceId);
- DeviceSubscriptionData deviceDetail = new DeviceSubscriptionData();
- deviceDetail.setDeviceId(subscription.getDeviceId());
- deviceDetail.setSubId(subscription.getId());
- deviceDetail.setDeviceName(ownerWithDevice.getDeviceNames());
- deviceDetail.setDeviceOwner(ownerWithDevice.getUserName());
- deviceDetail.setDeviceStatus(ownerWithDevice.getDeviceStatus());
- deviceDetail.setActionType(subscription.getActionTriggeredFrom());
- deviceDetail.setStatus(subscription.getStatus());
- deviceDetail.setActionTriggeredBy(subscription.getSubscribedBy());
- deviceDetail.setActionTriggeredTimestamp(subscription.getSubscribedTimestamp());
- deviceDetail.setUnsubscribed(subscription.isUnsubscribed());
- deviceDetail.setUnsubscribedBy(subscription.getUnsubscribedBy());
- deviceDetail.setUnsubscribedTimestamp(subscription.getUnsubscribedTimestamp());
- deviceDetail.setType(ownerWithDevice.getDeviceTypes());
- deviceDetail.setDeviceIdentifier(ownerWithDevice.getDeviceIdentifiers());
-
- String status = subscription.getStatus();
- switch (status) {
- case "COMPLETED":
- installedDevices.add(deviceDetail);
- statusCounts.put("COMPLETED", statusCounts.get("COMPLETED") + 1);
- break;
- case "ERROR":
- case "INVALID":
- case "UNAUTHORIZED":
- errorDevices.add(deviceDetail);
- statusCounts.put("ERROR", statusCounts.get("ERROR") + 1);
- break;
- case "IN_PROGRESS":
- case "PENDING":
- case "REPEATED":
- pendingDevices.add(deviceDetail);
- statusCounts.put("PENDING", statusCounts.get("PENDING") + 1);
- break;
- }
- } else if (unsubscribe && allSubscriptionForUnSubscribedMap.containsKey(deviceId) && !deviceSubscriptionMap.containsKey(deviceId)) {
- // Check if the device subscription has unsubscribed status set to false
- DeviceSubscriptionDTO allSubscription = allSubscriptionForUnSubscribedMap.get(deviceId);
- if (!allSubscription.isUnsubscribed()) {
- DeviceSubscriptionData subscribedDeviceDetail = new DeviceSubscriptionData();
- subscribedDeviceDetail.setDeviceId(allSubscription.getDeviceId());
- subscribedDeviceDetail.setDeviceName(ownerWithDevice.getDeviceNames());
- subscribedDeviceDetail.setDeviceOwner(ownerWithDevice.getUserName());
- subscribedDeviceDetail.setDeviceStatus(ownerWithDevice.getDeviceStatus());
- subscribedDeviceDetail.setSubId(allSubscription.getId());
- subscribedDeviceDetail.setActionTriggeredBy(allSubscription.getSubscribedBy());
- subscribedDeviceDetail.setActionTriggeredTimestamp(allSubscription.getSubscribedTimestamp());
- subscribedDeviceDetail.setActionType(allSubscription.getActionTriggeredFrom());
- subscribedDeviceDetail.setStatus(allSubscription.getStatus());
- subscribedDeviceDetail.setType(ownerWithDevice.getDeviceTypes());
- subscribedDeviceDetail.setDeviceIdentifier(ownerWithDevice.getDeviceIdentifiers());
- subscribedDevices.add(subscribedDeviceDetail);
- statusCounts.put("SUBSCRIBED", statusCounts.get("SUBSCRIBED") + 1);
- }
- } else if (unsubscribe && !allSubscriptionForUnSubscribedMap.containsKey(deviceId) && !deviceSubscriptionMap.containsKey(deviceId)
- && (allDevicesMap.containsKey(deviceId))) {
- DeviceSubscriptionData newDeviceDetail = new DeviceSubscriptionData();
- newDeviceDetail.setDeviceId(deviceId);
- newDeviceDetail.setDeviceOwner(ownerWithDevice.getUserName());
- newDeviceDetail.setDeviceStatus(ownerWithDevice.getDeviceStatus());
- newDeviceDetail.setType(ownerWithDevice.getDeviceTypes());
- newDeviceDetail.setDeviceIdentifier(ownerWithDevice.getDeviceIdentifiers());
- newDevices.add(newDeviceDetail);
- statusCounts.put("NEW", statusCounts.get("NEW") + 1);
- } else if (!unsubscribe && !allSubscriptionForSubscribedMap.containsKey(deviceId) && !deviceSubscriptionMap.containsKey(deviceId)
- && (allDevicesMap.containsKey(deviceId))) {
- DeviceSubscriptionData newDeviceDetail = new DeviceSubscriptionData();
- newDeviceDetail.setDeviceId(deviceId);
- newDeviceDetail.setDeviceName(ownerWithDevice.getDeviceNames());
- newDeviceDetail.setDeviceOwner(ownerWithDevice.getUserName());
- newDeviceDetail.setDeviceStatus(ownerWithDevice.getDeviceStatus());
- newDeviceDetail.setType(ownerWithDevice.getDeviceTypes());
- newDeviceDetail.setDeviceIdentifier(ownerWithDevice.getDeviceIdentifiers());
- newDevices.add(newDeviceDetail);
- statusCounts.put("NEW", statusCounts.get("NEW") + 1);
- }
- }
-
- int totalDevices = allDevices.size();
- Map statusPercentages = new HashMap<>();
- for (Map.Entry entry : statusCounts.entrySet()) {
- double percentage = ((double) entry.getValue() / totalDevices) * 100;
- String formattedPercentage = String.format("%.2f", percentage);
- statusPercentages.put(entry.getKey(), Double.valueOf(formattedPercentage));
- }
-
- List requestedDevices = new ArrayList<>();
- if (StringUtils.isNotBlank(request.getTabActionStatus())) {
- switch (request.getTabActionStatus()) {
- case "COMPLETED":
- requestedDevices = installedDevices;
- break;
- case "PENDING":
- requestedDevices = pendingDevices;
- break;
- case "ERROR":
- requestedDevices = errorDevices;
- break;
- case "NEW":
- requestedDevices = newDevices;
- break;
- case "SUBSCRIBED":
- requestedDevices = subscribedDevices;
- break;
- }
- } else {
- requestedDevices.addAll(installedDevices);
- requestedDevices.addAll(pendingDevices);
- requestedDevices.addAll(errorDevices);
- requestedDevices.addAll(newDevices);
- requestedDevices.addAll(subscribedDevices);
- }
-
- CategorizedSubscriptionResult categorizedSubscriptionResult =
- new CategorizedSubscriptionResult(installedDevices, pendingDevices, errorDevices, newDevices, subscribedDevices);
- DeviceSubscriptionResponseDTO deviceSubscriptionResponse =
- new DeviceSubscriptionResponseDTO(totalDevices, statusPercentages, categorizedSubscriptionResult);
-
- return deviceSubscriptionResponse;
-
- } catch (ApplicationManagementDAOException e) {
- String msg = "Error occurred while getting device subscriptions for the application release UUID: " + uuid;
- log.error(msg, e);
- throw new ApplicationManagementException(msg, e);
- } catch (DBConnectionException e) {
- String msg = "DB Connection error occurred while getting device subscriptions for UUID: " + uuid;
- log.error(msg, e);
- throw new ApplicationManagementException(msg, e);
- } catch (DeviceManagementDAOException e) {
- throw new RuntimeException(e);
- } finally {
- ConnectionManagerUtil.closeDBConnection();
- }
+ SubscriptionManagementHelperService subscriptionManagementHelperService =
+ SubscriptionManagementServiceProvider.getInstance().getSubscriptionManagementHelperService(subscriptionInfo);
+ return subscriptionManagementHelperService.getStatusBaseSubscriptions(subscriptionInfo, limit, offset);
}
+ /**
+ * Get subscription statistics related data describes by the {@link SubscriptionInfo}
+ * @param subscriptionInfo {@link SubscriptionInfo}
+ * @return {@link SubscriptionStatistics}
+ * @throws ApplicationManagementException Throws when error encountered while getting statistics
+ */
@Override
- public DeviceSubscriptionResponseDTO getAllSubscriptionDetailsByUUID(String uuid, String subscriptionStatus, PaginationRequest request,
- int offset, int limit) throws ApplicationManagementException {
- int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true);
- boolean unsubscribe = subscriptionStatus.equals("unsubscribed");
-
- try {
- ConnectionManagerUtil.openDBConnection();
-
- ApplicationReleaseDTO applicationReleaseDTO = this.applicationReleaseDAO.getReleaseByUUID(uuid, tenantId);
- if (applicationReleaseDTO == null) {
- String msg = "Couldn't find an application release for application release UUID: " + uuid;
- log.error(msg);
- throw new NotFoundException(msg);
- }
- ApplicationDTO applicationDTO = this.applicationDAO.getAppWithRelatedRelease(uuid, tenantId);
- int appReleaseId = applicationReleaseDTO.getId();
-
- List allSubscriptions =
- subscriptionDAO.getAllSubscriptionsDetails(appReleaseId, unsubscribe, tenantId, request.getActionStatus(),
- request.getActionType(), request.getActionTriggeredBy(), offset, limit);
-
- // empty response for no subscriptions
- if (allSubscriptions.isEmpty()) {
- return new DeviceSubscriptionResponseDTO(0, Collections.emptyMap(),
- new CategorizedSubscriptionResult(Collections.emptyList(),
- Collections.emptyList(), Collections.emptyList(), Collections.emptyList()));
- }
-
- DeviceManagementProviderService deviceManagementProviderService = HelperUtil.getDeviceManagementProviderService();
-
- Map allSubscriptionMap = allSubscriptions.stream()
- .collect(Collectors.toMap(DeviceSubscriptionDTO::getDeviceId, Function.identity()));
-
- List pendingDevices = new ArrayList<>();
- List installedDevices = new ArrayList<>();
- List errorDevices = new ArrayList<>();
- List newDevices = new ArrayList<>();
-
- Map statusCounts = new HashMap<>();
- statusCounts.put("PENDING", 0);
- statusCounts.put("COMPLETED", 0);
- statusCounts.put("ERROR", 0);
- statusCounts.put("NEW", 0);
-
- List allDevices =
- deviceManagementProviderService.getDevicesByTenantId(tenantId, applicationDTO.getDeviceTypeId(), request.getOwner(),
- request.getDeviceStatus());
-
- for (DeviceDetailsDTO device : allDevices) {
- Integer deviceId = device.getDeviceId();
- OwnerWithDeviceDTO ownerWithDevice =
- deviceManagementProviderService.getOwnerWithDeviceByDeviceId(deviceId, request.getOwner(), request.getDeviceName(),
- request.getDeviceStatus());
- if (ownerWithDevice == null || (request.getDeviceName() != null && !request.getDeviceName().isEmpty() &&
- (ownerWithDevice.getDeviceNames() == null || !ownerWithDevice.getDeviceNames().contains(request.getDeviceName())))) {
- continue;
- }
- if (allSubscriptionMap.containsKey(deviceId)) {
- DeviceSubscriptionDTO subscription = allSubscriptionMap.get(deviceId);
- DeviceSubscriptionData deviceDetail = new DeviceSubscriptionData();
- deviceDetail.setDeviceId(subscription.getDeviceId());
- deviceDetail.setDeviceName(ownerWithDevice.getDeviceNames());
- deviceDetail.setSubId(subscription.getId());
- deviceDetail.setDeviceOwner(ownerWithDevice.getUserName());
- deviceDetail.setDeviceStatus(ownerWithDevice.getDeviceStatus());
- deviceDetail.setActionType(subscription.getActionTriggeredFrom());
- deviceDetail.setStatus(subscription.getStatus());
- deviceDetail.setActionTriggeredBy(subscription.getSubscribedBy());
- deviceDetail.setActionTriggeredTimestamp(subscription.getSubscribedTimestamp());
- deviceDetail.setUnsubscribed(subscription.isUnsubscribed());
- deviceDetail.setUnsubscribedBy(subscription.getUnsubscribedBy());
- deviceDetail.setUnsubscribedTimestamp(subscription.getUnsubscribedTimestamp());
- deviceDetail.setType(ownerWithDevice.getDeviceTypes());
- deviceDetail.setDeviceIdentifier(ownerWithDevice.getDeviceIdentifiers());
-
- String status = subscription.getStatus();
- switch (status) {
- case "COMPLETED":
- installedDevices.add(deviceDetail);
- statusCounts.put("COMPLETED", statusCounts.get("COMPLETED") + 1);
- break;
- case "ERROR":
- case "INVALID":
- case "UNAUTHORIZED":
- errorDevices.add(deviceDetail);
- statusCounts.put("ERROR", statusCounts.get("ERROR") + 1);
- break;
- case "IN_PROGRESS":
- case "PENDING":
- case "REPEATED":
- pendingDevices.add(deviceDetail);
- statusCounts.put("PENDING", statusCounts.get("PENDING") + 1);
- break;
- }
- } else {
- DeviceSubscriptionData newDeviceDetail = new DeviceSubscriptionData();
- newDeviceDetail.setDeviceId(deviceId);
- newDeviceDetail.setDeviceName(ownerWithDevice.getDeviceNames());
- newDeviceDetail.setDeviceOwner(ownerWithDevice.getUserName());
- newDeviceDetail.setDeviceStatus(ownerWithDevice.getDeviceStatus());
- newDeviceDetail.setType(ownerWithDevice.getDeviceTypes());
- newDeviceDetail.setDeviceIdentifier(ownerWithDevice.getDeviceIdentifiers());
- newDevices.add(newDeviceDetail);
- statusCounts.put("NEW", statusCounts.get("NEW") + 1);
- }
- }
-
- int totalDevices = allDevices.size();
- Map statusPercentages = new HashMap<>();
- for (Map.Entry entry : statusCounts.entrySet()) {
- double percentage = ((double) entry.getValue() / totalDevices) * 100;
- String formattedPercentage = String.format("%.2f", percentage);
- statusPercentages.put(entry.getKey(), Double.valueOf(formattedPercentage));
- }
-
- List requestedDevices = new ArrayList<>();
- if (StringUtils.isNotBlank(request.getTabActionStatus())) {
- switch (request.getTabActionStatus()) {
- case "COMPLETED":
- requestedDevices = installedDevices;
- break;
- case "PENDING":
- requestedDevices = pendingDevices;
- break;
- case "ERROR":
- requestedDevices = errorDevices;
- break;
- case "NEW":
- requestedDevices = newDevices;
- break;
- }
- } else {
- requestedDevices.addAll(installedDevices);
- requestedDevices.addAll(pendingDevices);
- requestedDevices.addAll(errorDevices);
- requestedDevices.addAll(newDevices);
- }
-
- CategorizedSubscriptionResult categorizedSubscriptionResult =
- new CategorizedSubscriptionResult(installedDevices, pendingDevices, errorDevices, newDevices);
- DeviceSubscriptionResponseDTO result =
- new DeviceSubscriptionResponseDTO(totalDevices, statusPercentages, categorizedSubscriptionResult);
-
- return result;
- } catch (ApplicationManagementDAOException e) {
- String msg = "Error occurred while getting user subscriptions for the application release UUID: " + uuid;
- log.error(msg, e);
- throw new ApplicationManagementException(msg, e);
- } catch (DBConnectionException e) {
- String msg = "DB Connection error occurred while getting user subscriptions for UUID: " + uuid;
- log.error(msg, e);
- throw new ApplicationManagementException(msg, e);
- } catch (DeviceManagementDAOException e) {
- throw new RuntimeException(e);
- } finally {
- ConnectionManagerUtil.closeDBConnection();
- }
+ public SubscriptionStatistics getStatistics(SubscriptionInfo subscriptionInfo) throws ApplicationManagementException {
+ return SubscriptionManagementServiceProvider.getInstance().getSubscriptionManagementHelperService(subscriptionInfo).
+ getSubscriptionStatistics(subscriptionInfo);
}
@Override
@@ -2871,13 +1843,9 @@ public class SubscriptionManagerImpl implements SubscriptionManager {
List subscriptionCounts = new ArrayList<>();
subscriptionCounts.add(new CategorizedSubscriptionCountsDTO(
- "All",
+ "Device",
subscriptionDAO.getAllSubscriptionCount(appReleaseId, tenantId),
subscriptionDAO.getAllUnsubscriptionCount(appReleaseId, tenantId)));
- subscriptionCounts.add(new CategorizedSubscriptionCountsDTO(
- "Device",
- subscriptionDAO.getDeviceSubscriptionCount(appReleaseId, tenantId),
- subscriptionDAO.getDeviceUnsubscriptionCount(appReleaseId, tenantId)));
subscriptionCounts.add(new CategorizedSubscriptionCountsDTO(
"Group",
subscriptionDAO.getGroupSubscriptionCount(appReleaseId, tenantId),
diff --git a/components/application-mgt/io.entgra.device.mgt.core.application.mgt.core/src/main/java/io/entgra/device/mgt/core/application/mgt/core/util/subscription/mgt/SubscriptionManagementHelperUtil.java b/components/application-mgt/io.entgra.device.mgt.core.application.mgt.core/src/main/java/io/entgra/device/mgt/core/application/mgt/core/util/subscription/mgt/SubscriptionManagementHelperUtil.java
new file mode 100644
index 0000000000..0fbc32b986
--- /dev/null
+++ b/components/application-mgt/io.entgra.device.mgt.core.application.mgt.core/src/main/java/io/entgra/device/mgt/core/application/mgt/core/util/subscription/mgt/SubscriptionManagementHelperUtil.java
@@ -0,0 +1,207 @@
+/*
+ * Copyright (c) 2018 - 2024, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved.
+ *
+ * Entgra (Pvt) Ltd. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package io.entgra.device.mgt.core.application.mgt.core.util.subscription.mgt;
+
+import io.entgra.device.mgt.core.application.mgt.common.DeviceSubscription;
+import io.entgra.device.mgt.core.application.mgt.common.DeviceSubscriptionFilterCriteria;
+import io.entgra.device.mgt.core.application.mgt.common.SubscriptionData;
+import io.entgra.device.mgt.core.application.mgt.common.SubscriptionInfo;
+import io.entgra.device.mgt.core.application.mgt.common.SubscriptionMetadata;
+import io.entgra.device.mgt.core.application.mgt.common.SubscriptionStatistics;
+import io.entgra.device.mgt.core.application.mgt.common.dto.DeviceSubscriptionDTO;
+import io.entgra.device.mgt.core.application.mgt.common.dto.SubscriptionStatisticDTO;
+import io.entgra.device.mgt.core.application.mgt.core.util.HelperUtil;
+import io.entgra.device.mgt.core.device.mgt.common.Device;
+import io.entgra.device.mgt.core.device.mgt.common.PaginationRequest;
+import io.entgra.device.mgt.core.device.mgt.common.exceptions.DeviceManagementException;
+
+import java.sql.Timestamp;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+
+public class SubscriptionManagementHelperUtil {
+
+ /**
+ * Retrieves device subscription data based on the provided filters.
+ *
+ * @param deviceSubscriptionDTOS List of DeviceSubscriptionDTO objects.
+ * @param deviceSubscriptionFilterCriteria Filter criteria for device subscription.
+ * @param isUnsubscribed Boolean indicating whether to filter unsubscribed devices.
+ * @param deviceTypeId Device type ID.
+ * @param limit Limit for pagination.
+ * @param offset Offset for pagination.
+ * @return List of DeviceSubscription objects.
+ * @throws DeviceManagementException If an error occurs during device management.
+ */
+ public static List getDeviceSubscriptionData(List deviceSubscriptionDTOS,
+ DeviceSubscriptionFilterCriteria deviceSubscriptionFilterCriteria,
+ boolean isUnsubscribed, int deviceTypeId, int limit, int offset)
+ throws DeviceManagementException {
+ List deviceIds = deviceSubscriptionDTOS.stream().map(DeviceSubscriptionDTO::getDeviceId).collect(Collectors.toList());
+ PaginationRequest paginationRequest = new PaginationRequest(offset, limit);
+ paginationRequest.setDeviceName(deviceSubscriptionFilterCriteria.getName());
+ paginationRequest.setDeviceStatus(deviceSubscriptionFilterCriteria.getDeviceStatus());
+ paginationRequest.setOwner(deviceSubscriptionFilterCriteria.getOwner());
+ paginationRequest.setDeviceTypeId(deviceTypeId);
+ List devices = HelperUtil.getDeviceManagementProviderService().getDevicesByDeviceIds(paginationRequest, deviceIds);
+ return populateDeviceData(deviceSubscriptionDTOS, devices, isUnsubscribed);
+ }
+
+ /**
+ * Retrieves the total count of device subscriptions based on the provided filters.
+ *
+ * @param deviceSubscriptionDTOS List of DeviceSubscriptionDTO objects.
+ * @param deviceSubscriptionFilterCriteria Filter criteria for device subscription.
+ * @param deviceTypeId Device type ID.
+ * @return int Total count of device subscriptions.
+ * @throws DeviceManagementException If an error occurs during device management.
+ */
+ public static int getTotalDeviceSubscriptionCount(List deviceSubscriptionDTOS,
+ DeviceSubscriptionFilterCriteria deviceSubscriptionFilterCriteria, int deviceTypeId)
+ throws DeviceManagementException {
+ List deviceIds = deviceSubscriptionDTOS.stream().map(DeviceSubscriptionDTO::getDeviceId).collect(Collectors.toList());
+ PaginationRequest paginationRequest = new PaginationRequest(-1, -1);
+ paginationRequest.setDeviceName(deviceSubscriptionFilterCriteria.getName());
+ paginationRequest.setDeviceStatus(deviceSubscriptionFilterCriteria.getDeviceStatus());
+ paginationRequest.setOwner(deviceSubscriptionFilterCriteria.getOwner());
+ paginationRequest.setDeviceTypeId(deviceTypeId);
+ return HelperUtil.getDeviceManagementProviderService().getDeviceCountByDeviceIds(paginationRequest, deviceIds);
+ }
+
+ /**
+ * Populates device subscription data based on the provided devices and subscription DTOs.
+ *
+ * @param deviceSubscriptionDTOS List of DeviceSubscriptionDTO objects.
+ * @param devices List of Device objects.
+ * @param isUnsubscribed Boolean indicating whether to filter unsubscribed devices.
+ * @return List of DeviceSubscription objects.
+ */
+ private static List populateDeviceData(List deviceSubscriptionDTOS,
+ List devices, boolean isUnsubscribed) {
+ List deviceSubscriptions = new ArrayList<>();
+ for (Device device : devices) {
+ int idx = deviceSubscriptionDTOS.indexOf(new DeviceSubscriptionDTO(device.getId()));
+ if (idx >= 0) {
+ DeviceSubscriptionDTO deviceSubscriptionDTO = deviceSubscriptionDTOS.get(idx);
+ DeviceSubscription deviceSubscription = new DeviceSubscription();
+ deviceSubscription.setDeviceId(device.getId());
+ deviceSubscription.setDeviceIdentifier(device.getDeviceIdentifier());
+ deviceSubscription.setDeviceOwner(device.getEnrolmentInfo().getOwner());
+ deviceSubscription.setDeviceType(device.getType());
+ deviceSubscription.setDeviceName(device.getName());
+ deviceSubscription.setDeviceStatus(device.getEnrolmentInfo().getStatus().name());
+ deviceSubscription.setOwnershipType(device.getEnrolmentInfo().getOwnership().name());
+ deviceSubscription.setDateOfLastUpdate(new Timestamp(device.getEnrolmentInfo().getDateOfLastUpdate()));
+ SubscriptionData subscriptionData = getSubscriptionData(isUnsubscribed, deviceSubscriptionDTO);
+ deviceSubscription.setSubscriptionData(subscriptionData);
+ deviceSubscriptions.add(deviceSubscription);
+ }
+ }
+ return deviceSubscriptions;
+ }
+
+ /**
+ * Creates a SubscriptionData object based on the provided subscription DTO.
+ *
+ * @param isUnsubscribed Boolean indicating whether to filter unsubscribed devices.
+ * @param deviceSubscriptionDTO DeviceSubscriptionDTO object.
+ * @return SubscriptionData object.
+ */
+ private static SubscriptionData getSubscriptionData(boolean isUnsubscribed, DeviceSubscriptionDTO deviceSubscriptionDTO) {
+ SubscriptionData subscriptionData = new SubscriptionData();
+ subscriptionData.setTriggeredBy(isUnsubscribed ? deviceSubscriptionDTO.getUnsubscribedBy() :
+ deviceSubscriptionDTO.getSubscribedBy());
+ subscriptionData.setTriggeredAt(deviceSubscriptionDTO.getSubscribedTimestamp());
+ subscriptionData.setDeviceSubscriptionStatus(deviceSubscriptionDTO.getStatus());
+ subscriptionData.setSubscriptionType(deviceSubscriptionDTO.getActionTriggeredFrom());
+ subscriptionData.setSubscriptionId(deviceSubscriptionDTO.getId());
+ return subscriptionData;
+ }
+
+ /**
+ * Retrieves the device subscription status based on the provided subscription info.
+ *
+ * @param subscriptionInfo SubscriptionInfo object.
+ * @return Device subscription status.
+ */
+ public static String getDeviceSubscriptionStatus(SubscriptionInfo subscriptionInfo) {
+ return getDeviceSubscriptionStatus(subscriptionInfo.getDeviceSubscriptionFilterCriteria().
+ getFilteringDeviceSubscriptionStatus(), subscriptionInfo.getDeviceSubscriptionStatus());
+ }
+
+ /**
+ * Retrieves the device subscription status based on the provided filter and status.
+ *
+ * @param deviceSubscriptionStatusFilter Filtered device subscription status.
+ * @param deviceSubscriptionStatus Device subscription status.
+ * @return Device subscription status.
+ */
+ public static String getDeviceSubscriptionStatus(String deviceSubscriptionStatusFilter, String deviceSubscriptionStatus) {
+ return (deviceSubscriptionStatusFilter != null && !deviceSubscriptionStatusFilter.isEmpty()) ?
+ deviceSubscriptionStatusFilter : deviceSubscriptionStatus;
+ }
+
+ /**
+ * Retrieves subscription statistics based on the provided subscription statistics DTO and device count.
+ *
+ * @param subscriptionStatisticDTO SubscriptionStatisticDTO object.
+ * @param allDeviceCount Total count of all devices.
+ * @return SubscriptionStatistics object.
+ */
+ public static SubscriptionStatistics getSubscriptionStatistics(SubscriptionStatisticDTO subscriptionStatisticDTO, int allDeviceCount) {
+ SubscriptionStatistics subscriptionStatistics = new SubscriptionStatistics();
+ subscriptionStatistics.setCompletedPercentage(
+ getPercentage(subscriptionStatisticDTO.getCompletedDeviceCount(), allDeviceCount));
+ subscriptionStatistics.setPendingPercentage(
+ getPercentage(subscriptionStatisticDTO.getPendingDevicesCount(), allDeviceCount));
+ subscriptionStatistics.setFailedPercentage(
+ getPercentage(subscriptionStatisticDTO.getFailedDevicesCount(), allDeviceCount));
+ subscriptionStatistics.setNewDevicesPercentage(getPercentage((allDeviceCount -
+ subscriptionStatisticDTO.getCompletedDeviceCount() -
+ subscriptionStatisticDTO.getPendingDevicesCount() -
+ subscriptionStatisticDTO.getFailedDevicesCount()), allDeviceCount));
+ return subscriptionStatistics;
+ }
+
+ /**
+ * Calculates the percentages.
+ *
+ * @param numerator Numerator value.
+ * @param denominator Denominator value.
+ * @return Calculated percentage.
+ */
+ public static float getPercentage(int numerator, int denominator) {
+ if (denominator <= 0) {
+ return 0.0f;
+ }
+ return ((float) numerator / (float) denominator) * 100;
+ }
+
+ /**
+ * Retrieves database subscription statuses based on the provided device subscription status.
+ *
+ * @param deviceSubscriptionStatus Device subscription status.
+ * @return List of database subscription statuses.
+ */
+ public static List getDBSubscriptionStatus(String deviceSubscriptionStatus) {
+ return SubscriptionMetadata.deviceSubscriptionStatusToDBSubscriptionStatusMap.get(deviceSubscriptionStatus);
+ }
+}
diff --git a/components/application-mgt/io.entgra.device.mgt.core.application.mgt.core/src/main/java/io/entgra/device/mgt/core/application/mgt/core/util/subscription/mgt/SubscriptionManagementServiceProvider.java b/components/application-mgt/io.entgra.device.mgt.core.application.mgt.core/src/main/java/io/entgra/device/mgt/core/application/mgt/core/util/subscription/mgt/SubscriptionManagementServiceProvider.java
new file mode 100644
index 0000000000..1f13a8a5fa
--- /dev/null
+++ b/components/application-mgt/io.entgra.device.mgt.core.application.mgt.core/src/main/java/io/entgra/device/mgt/core/application/mgt/core/util/subscription/mgt/SubscriptionManagementServiceProvider.java
@@ -0,0 +1,71 @@
+/*
+ * Copyright (c) 2018 - 2024, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved.
+ *
+ * Entgra (Pvt) Ltd. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package io.entgra.device.mgt.core.application.mgt.core.util.subscription.mgt;
+
+import io.entgra.device.mgt.core.application.mgt.common.SubscriptionInfo;
+import io.entgra.device.mgt.core.application.mgt.common.SubscriptionMetadata;
+import io.entgra.device.mgt.core.application.mgt.core.util.subscription.mgt.impl.DeviceBasedSubscriptionManagementHelperServiceImpl;
+import io.entgra.device.mgt.core.application.mgt.core.util.subscription.mgt.impl.GroupBasedSubscriptionManagementHelperServiceImpl;
+import io.entgra.device.mgt.core.application.mgt.core.util.subscription.mgt.impl.RoleBasedSubscriptionManagementHelperServiceImpl;
+import io.entgra.device.mgt.core.application.mgt.core.util.subscription.mgt.impl.UserBasedSubscriptionManagementHelperServiceImpl;
+import io.entgra.device.mgt.core.application.mgt.core.util.subscription.mgt.service.SubscriptionManagementHelperService;
+
+import java.util.Objects;
+
+public class SubscriptionManagementServiceProvider {
+ private SubscriptionManagementServiceProvider() {
+ }
+
+ public static SubscriptionManagementServiceProvider getInstance() {
+ return SubscriptionManagementProviderServiceHolder.INSTANCE;
+ }
+
+ /**
+ * Retrieves the appropriate SubscriptionManagementHelperService based on the provided SubscriptionInfo.
+ *
+ * @param subscriptionInfo SubscriptionInfo object containing the subscription type.
+ * @return SubscriptionManagementHelperService implementation based on the subscription type.
+ */
+ public SubscriptionManagementHelperService getSubscriptionManagementHelperService(SubscriptionInfo subscriptionInfo) {
+ return getSubscriptionManagementHelperService(subscriptionInfo.getSubscriptionType());
+ }
+
+ /**
+ * Retrieves the appropriate SubscriptionManagementHelperService based on the subscription type.
+ *
+ * @param subscriptionType Type of the subscription.
+ * @return SubscriptionManagementHelperService implementation based on the subscription type.
+ */
+ private SubscriptionManagementHelperService getSubscriptionManagementHelperService(String subscriptionType) {
+ if (Objects.equals(subscriptionType, SubscriptionMetadata.SubscriptionTypes.ROLE))
+ return RoleBasedSubscriptionManagementHelperServiceImpl.getInstance();
+ if (Objects.equals(subscriptionType, SubscriptionMetadata.SubscriptionTypes.GROUP))
+ return GroupBasedSubscriptionManagementHelperServiceImpl.getInstance();
+ if (Objects.equals(subscriptionType, SubscriptionMetadata.SubscriptionTypes.USER))
+ return UserBasedSubscriptionManagementHelperServiceImpl.getInstance();
+ if (Objects.equals(subscriptionType, SubscriptionMetadata.SubscriptionTypes.DEVICE))
+ return DeviceBasedSubscriptionManagementHelperServiceImpl.getInstance();
+ throw new UnsupportedOperationException("Subscription type: " + subscriptionType + " not supports");
+ }
+
+ private static class SubscriptionManagementProviderServiceHolder {
+ private static final SubscriptionManagementServiceProvider INSTANCE = new SubscriptionManagementServiceProvider();
+ }
+}
diff --git a/components/application-mgt/io.entgra.device.mgt.core.application.mgt.core/src/main/java/io/entgra/device/mgt/core/application/mgt/core/util/subscription/mgt/impl/DeviceBasedSubscriptionManagementHelperServiceImpl.java b/components/application-mgt/io.entgra.device.mgt.core.application.mgt.core/src/main/java/io/entgra/device/mgt/core/application/mgt/core/util/subscription/mgt/impl/DeviceBasedSubscriptionManagementHelperServiceImpl.java
new file mode 100644
index 0000000000..88e78e82cd
--- /dev/null
+++ b/components/application-mgt/io.entgra.device.mgt.core.application.mgt.core/src/main/java/io/entgra/device/mgt/core/application/mgt/core/util/subscription/mgt/impl/DeviceBasedSubscriptionManagementHelperServiceImpl.java
@@ -0,0 +1,143 @@
+/*
+ * Copyright (c) 2018 - 2024, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved.
+ *
+ * Entgra (Pvt) Ltd. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package io.entgra.device.mgt.core.application.mgt.core.util.subscription.mgt.impl;
+
+import io.entgra.device.mgt.core.application.mgt.common.DeviceSubscription;
+import io.entgra.device.mgt.core.application.mgt.common.DeviceSubscriptionFilterCriteria;
+import io.entgra.device.mgt.core.application.mgt.common.SubscriptionInfo;
+import io.entgra.device.mgt.core.application.mgt.common.SubscriptionMetadata;
+import io.entgra.device.mgt.core.application.mgt.common.SubscriptionResponse;
+import io.entgra.device.mgt.core.application.mgt.common.SubscriptionStatistics;
+import io.entgra.device.mgt.core.application.mgt.common.dto.ApplicationDTO;
+import io.entgra.device.mgt.core.application.mgt.common.dto.ApplicationReleaseDTO;
+import io.entgra.device.mgt.core.application.mgt.common.dto.DeviceSubscriptionDTO;
+import io.entgra.device.mgt.core.application.mgt.common.exception.ApplicationManagementException;
+import io.entgra.device.mgt.core.application.mgt.common.exception.DBConnectionException;
+import io.entgra.device.mgt.core.application.mgt.core.exception.ApplicationManagementDAOException;
+import io.entgra.device.mgt.core.application.mgt.core.exception.NotFoundException;
+import io.entgra.device.mgt.core.application.mgt.core.util.ConnectionManagerUtil;
+import io.entgra.device.mgt.core.application.mgt.core.util.HelperUtil;
+import io.entgra.device.mgt.core.application.mgt.core.util.subscription.mgt.SubscriptionManagementHelperUtil;
+import io.entgra.device.mgt.core.application.mgt.core.util.subscription.mgt.service.SubscriptionManagementHelperService;
+import io.entgra.device.mgt.core.device.mgt.common.exceptions.DeviceManagementException;
+import io.entgra.device.mgt.core.device.mgt.core.service.DeviceManagementProviderService;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.wso2.carbon.context.PrivilegedCarbonContext;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+public class DeviceBasedSubscriptionManagementHelperServiceImpl implements SubscriptionManagementHelperService {
+ private static final Log log = LogFactory.getLog(DeviceBasedSubscriptionManagementHelperServiceImpl.class);
+
+ private DeviceBasedSubscriptionManagementHelperServiceImpl() {
+ }
+
+ public static DeviceBasedSubscriptionManagementHelperServiceImpl getInstance() {
+ return DeviceBasedSubscriptionManagementHelperServiceImpl.DeviceBasedSubscriptionManagementHelperServiceImplHolder.INSTANCE;
+ }
+
+ @Override
+ public SubscriptionResponse getStatusBaseSubscriptions(SubscriptionInfo subscriptionInfo, int limit, int offset)
+ throws ApplicationManagementException {
+ final boolean isUnsubscribe = Objects.equals(SubscriptionMetadata.SUBSCRIPTION_STATUS_UNSUBSCRIBED, subscriptionInfo.getSubscriptionStatus());
+ List deviceSubscriptionDTOS;
+ int deviceCount = 0;
+ int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId();
+
+ try {
+ ConnectionManagerUtil.openDBConnection();
+ ApplicationReleaseDTO applicationReleaseDTO = applicationReleaseDAO.
+ getReleaseByUUID(subscriptionInfo.getApplicationUUID(), tenantId);
+ if (applicationReleaseDTO == null) {
+ String msg = "Couldn't find an application release for application release UUID: " +
+ subscriptionInfo.getApplicationUUID();
+ log.error(msg);
+ throw new NotFoundException(msg);
+ }
+
+ ApplicationDTO applicationDTO = this.applicationDAO.getAppWithRelatedRelease(subscriptionInfo.getApplicationUUID(), tenantId);
+ if (applicationDTO == null) {
+ String msg = "Application not found for the release UUID: " + subscriptionInfo.getApplicationUUID();
+ log.error(msg);
+ throw new NotFoundException(msg);
+ }
+
+ String deviceSubscriptionStatus = SubscriptionManagementHelperUtil.getDeviceSubscriptionStatus(subscriptionInfo);
+ DeviceSubscriptionFilterCriteria deviceSubscriptionFilterCriteria = subscriptionInfo.getDeviceSubscriptionFilterCriteria();
+ DeviceManagementProviderService deviceManagementProviderService = HelperUtil.getDeviceManagementProviderService();
+ List dbSubscriptionStatus = SubscriptionManagementHelperUtil.getDBSubscriptionStatus(subscriptionInfo.getDeviceSubscriptionStatus());
+
+ if (Objects.equals(SubscriptionMetadata.DeviceSubscriptionStatus.NEW, deviceSubscriptionStatus)) {
+ deviceSubscriptionDTOS = subscriptionDAO.getAllSubscriptionsDetails(applicationReleaseDTO.
+ getId(), isUnsubscribe, tenantId, null, null,
+ deviceSubscriptionFilterCriteria.getTriggeredBy(), -1, -1);
+
+ List deviceIdsOfSubscription = deviceSubscriptionDTOS.stream().
+ map(DeviceSubscriptionDTO::getDeviceId).collect(Collectors.toList());
+
+ List newDeviceIds = deviceManagementProviderService.getDevicesNotInGivenIdList(deviceIdsOfSubscription);
+
+ deviceSubscriptionDTOS = newDeviceIds.stream().map(DeviceSubscriptionDTO::new).collect(Collectors.toList());
+ } else {
+ deviceSubscriptionDTOS = subscriptionDAO.getAllSubscriptionsDetails(applicationReleaseDTO.
+ getId(), isUnsubscribe, tenantId, dbSubscriptionStatus, null,
+ deviceSubscriptionFilterCriteria.getTriggeredBy(), -1, -1);
+ }
+ deviceCount = SubscriptionManagementHelperUtil.getTotalDeviceSubscriptionCount(deviceSubscriptionDTOS,
+ subscriptionInfo.getDeviceSubscriptionFilterCriteria(), applicationDTO.getDeviceTypeId());
+
+ List deviceSubscriptions = SubscriptionManagementHelperUtil.getDeviceSubscriptionData(deviceSubscriptionDTOS,
+ subscriptionInfo.getDeviceSubscriptionFilterCriteria(), isUnsubscribe, applicationDTO.getDeviceTypeId(), limit, offset);
+ return new SubscriptionResponse(subscriptionInfo.getApplicationUUID(), deviceCount, deviceSubscriptions);
+ } catch (DeviceManagementException e) {
+ String msg = "Error encountered while getting device details";
+ log.error(msg, e);
+ throw new ApplicationManagementException(msg, e);
+ } catch (ApplicationManagementDAOException | DBConnectionException e) {
+ String msg = "Error encountered while connecting to the database";
+ log.error(msg, e);
+ throw new ApplicationManagementException(msg, e);
+ } finally {
+ ConnectionManagerUtil.closeDBConnection();
+ }
+ }
+
+ @Override
+ public SubscriptionResponse getSubscriptions(SubscriptionInfo subscriptionInfo, int limit, int offset)
+ throws ApplicationManagementException {
+ return new SubscriptionResponse(subscriptionInfo.getApplicationUUID(), Collections.emptyList());
+ }
+
+ @Override
+ public SubscriptionStatistics getSubscriptionStatistics(SubscriptionInfo subscriptionInfo)
+ throws ApplicationManagementException {
+ return null;
+ }
+
+ private static class DeviceBasedSubscriptionManagementHelperServiceImplHolder {
+ private static final DeviceBasedSubscriptionManagementHelperServiceImpl INSTANCE
+ = new DeviceBasedSubscriptionManagementHelperServiceImpl();
+ }
+
+}
diff --git a/components/application-mgt/io.entgra.device.mgt.core.application.mgt.core/src/main/java/io/entgra/device/mgt/core/application/mgt/core/util/subscription/mgt/impl/GroupBasedSubscriptionManagementHelperServiceImpl.java b/components/application-mgt/io.entgra.device.mgt.core.application.mgt.core/src/main/java/io/entgra/device/mgt/core/application/mgt/core/util/subscription/mgt/impl/GroupBasedSubscriptionManagementHelperServiceImpl.java
new file mode 100644
index 0000000000..16834bf2a1
--- /dev/null
+++ b/components/application-mgt/io.entgra.device.mgt.core.application.mgt.core/src/main/java/io/entgra/device/mgt/core/application/mgt/core/util/subscription/mgt/impl/GroupBasedSubscriptionManagementHelperServiceImpl.java
@@ -0,0 +1,220 @@
+/*
+ * Copyright (c) 2018 - 2024, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved.
+ *
+ * Entgra (Pvt) Ltd. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package io.entgra.device.mgt.core.application.mgt.core.util.subscription.mgt.impl;
+
+import io.entgra.device.mgt.core.application.mgt.common.DeviceSubscription;
+import io.entgra.device.mgt.core.application.mgt.common.DeviceSubscriptionFilterCriteria;
+import io.entgra.device.mgt.core.application.mgt.common.SubscriptionEntity;
+import io.entgra.device.mgt.core.application.mgt.common.SubscriptionInfo;
+import io.entgra.device.mgt.core.application.mgt.common.SubscriptionMetadata;
+import io.entgra.device.mgt.core.application.mgt.common.SubscriptionResponse;
+import io.entgra.device.mgt.core.application.mgt.common.SubscriptionStatistics;
+import io.entgra.device.mgt.core.application.mgt.common.dto.ApplicationDTO;
+import io.entgra.device.mgt.core.application.mgt.common.dto.ApplicationReleaseDTO;
+import io.entgra.device.mgt.core.application.mgt.common.dto.DeviceSubscriptionDTO;
+import io.entgra.device.mgt.core.application.mgt.common.dto.SubscriptionStatisticDTO;
+import io.entgra.device.mgt.core.application.mgt.common.exception.ApplicationManagementException;
+import io.entgra.device.mgt.core.application.mgt.common.exception.DBConnectionException;
+import io.entgra.device.mgt.core.application.mgt.core.exception.ApplicationManagementDAOException;
+import io.entgra.device.mgt.core.application.mgt.core.exception.NotFoundException;
+import io.entgra.device.mgt.core.application.mgt.core.util.ConnectionManagerUtil;
+import io.entgra.device.mgt.core.application.mgt.core.util.HelperUtil;
+import io.entgra.device.mgt.core.application.mgt.core.util.subscription.mgt.SubscriptionManagementHelperUtil;
+import io.entgra.device.mgt.core.application.mgt.core.util.subscription.mgt.service.SubscriptionManagementHelperService;
+import io.entgra.device.mgt.core.device.mgt.common.Device;
+import io.entgra.device.mgt.core.device.mgt.common.exceptions.DeviceManagementException;
+import io.entgra.device.mgt.core.device.mgt.common.group.mgt.GroupManagementException;
+import io.entgra.device.mgt.core.device.mgt.core.dto.GroupDetailsDTO;
+import io.entgra.device.mgt.core.device.mgt.core.service.DeviceManagementProviderService;
+import io.entgra.device.mgt.core.device.mgt.core.service.GroupManagementProviderService;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.wso2.carbon.context.PrivilegedCarbonContext;
+
+import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+public class GroupBasedSubscriptionManagementHelperServiceImpl implements SubscriptionManagementHelperService {
+ private static final Log log = LogFactory.getLog(GroupBasedSubscriptionManagementHelperServiceImpl.class);
+
+ private GroupBasedSubscriptionManagementHelperServiceImpl() {
+ }
+
+ public static GroupBasedSubscriptionManagementHelperServiceImpl getInstance() {
+ return GroupBasedSubscriptionManagementHelperServiceImplHolder.INSTANCE;
+ }
+
+ @Override
+ public SubscriptionResponse getStatusBaseSubscriptions(SubscriptionInfo subscriptionInfo, int limit, int offset)
+ throws ApplicationManagementException {
+
+ final boolean isUnsubscribe = Objects.equals(SubscriptionMetadata.SUBSCRIPTION_STATUS_UNSUBSCRIBED, subscriptionInfo.getSubscriptionStatus());
+ List deviceSubscriptionDTOS;
+ int deviceCount = 0;
+ int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId();
+
+ try {
+ ConnectionManagerUtil.openDBConnection();
+ ApplicationReleaseDTO applicationReleaseDTO = applicationReleaseDAO.
+ getReleaseByUUID(subscriptionInfo.getApplicationUUID(), tenantId);
+
+ if (applicationReleaseDTO == null) {
+ String msg = "Couldn't find an application release for application release UUID: " +
+ subscriptionInfo.getApplicationUUID();
+ log.error(msg);
+ throw new NotFoundException(msg);
+ }
+
+ ApplicationDTO applicationDTO = this.applicationDAO.getAppWithRelatedRelease(subscriptionInfo.getApplicationUUID(), tenantId);
+ if (applicationDTO == null) {
+ String msg = "Application not found for the release UUID: " + subscriptionInfo.getApplicationUUID();
+ log.error(msg);
+ throw new NotFoundException(msg);
+ }
+
+ String deviceSubscriptionStatus = SubscriptionManagementHelperUtil.getDeviceSubscriptionStatus(subscriptionInfo);
+ DeviceSubscriptionFilterCriteria deviceSubscriptionFilterCriteria = subscriptionInfo.getDeviceSubscriptionFilterCriteria();
+ DeviceManagementProviderService deviceManagementProviderService = HelperUtil.getDeviceManagementProviderService();
+
+ GroupManagementProviderService groupManagementProviderService = HelperUtil.getGroupManagementProviderService();
+ GroupDetailsDTO groupDetailsDTO;
+ List dbSubscriptionStatus = SubscriptionManagementHelperUtil.getDBSubscriptionStatus(subscriptionInfo.getDeviceSubscriptionStatus());
+
+ if (Objects.equals(SubscriptionMetadata.DeviceSubscriptionStatus.NEW, deviceSubscriptionStatus)) {
+ List allDeviceIdsOwnByGroup = groupManagementProviderService.getGroupDetailsWithDevices(subscriptionInfo.getIdentifier(),
+ applicationDTO.getDeviceTypeId(), deviceSubscriptionFilterCriteria.getOwner(), deviceSubscriptionFilterCriteria.getName(),
+ deviceSubscriptionFilterCriteria.getDeviceStatus(), -1, -1).getDeviceIds();
+
+ deviceSubscriptionDTOS = subscriptionDAO.getSubscriptionDetailsByDeviceIds(applicationReleaseDTO.getId(),
+ isUnsubscribe, tenantId, allDeviceIdsOwnByGroup, null,
+ null, deviceSubscriptionFilterCriteria.getTriggeredBy(), -1, -1);
+
+ List deviceIdsOfSubscription = deviceSubscriptionDTOS.stream().
+ map(DeviceSubscriptionDTO::getDeviceId).collect(Collectors.toList());
+
+ for (Integer deviceId : deviceIdsOfSubscription) {
+ allDeviceIdsOwnByGroup.remove(deviceId);
+ }
+
+ List newDeviceIds = deviceManagementProviderService.getDevicesInGivenIdList(allDeviceIdsOwnByGroup);
+ deviceSubscriptionDTOS = newDeviceIds.stream().map(DeviceSubscriptionDTO::new).collect(Collectors.toList());
+ } else {
+ groupDetailsDTO = groupManagementProviderService.getGroupDetailsWithDevices(subscriptionInfo.getIdentifier(),
+ applicationDTO.getDeviceTypeId(), deviceSubscriptionFilterCriteria.getOwner(), deviceSubscriptionFilterCriteria.getName(),
+ deviceSubscriptionFilterCriteria.getDeviceStatus(), offset, limit);
+ List paginatedDeviceIdsOwnByGroup = groupDetailsDTO.getDeviceIds();
+
+ deviceSubscriptionDTOS = subscriptionDAO.getSubscriptionDetailsByDeviceIds(applicationReleaseDTO.getId(),
+ isUnsubscribe, tenantId, paginatedDeviceIdsOwnByGroup, dbSubscriptionStatus,
+ null, deviceSubscriptionFilterCriteria.getTriggeredBy(), -1, -1);
+
+ }
+ deviceCount = SubscriptionManagementHelperUtil.getTotalDeviceSubscriptionCount(deviceSubscriptionDTOS,
+ subscriptionInfo.getDeviceSubscriptionFilterCriteria(), applicationDTO.getDeviceTypeId());
+
+ List deviceSubscriptions = SubscriptionManagementHelperUtil.getDeviceSubscriptionData(deviceSubscriptionDTOS,
+ subscriptionInfo.getDeviceSubscriptionFilterCriteria(), isUnsubscribe, applicationDTO.getDeviceTypeId(), limit, offset);
+ return new SubscriptionResponse(subscriptionInfo.getApplicationUUID(), deviceCount, deviceSubscriptions);
+ } catch (GroupManagementException e) {
+ String msg = "Error encountered while retrieving group details for group: " + subscriptionInfo.getIdentifier();
+ log.error(msg, e);
+ throw new ApplicationManagementException(msg, e);
+ } catch (ApplicationManagementDAOException | DBConnectionException e) {
+ String msg = "Error encountered while connecting to the database";
+ log.error(msg, e);
+ throw new ApplicationManagementException(msg, e);
+ } catch (DeviceManagementException e) {
+ throw new RuntimeException(e);
+ } finally {
+ ConnectionManagerUtil.closeDBConnection();
+ }
+
+ }
+
+ @Override
+ public SubscriptionResponse getSubscriptions(SubscriptionInfo subscriptionInfo, int limit, int offset)
+ throws ApplicationManagementException {
+ final boolean isUnsubscribe = Objects.equals(SubscriptionMetadata.SUBSCRIPTION_STATUS_UNSUBSCRIBED, subscriptionInfo.getSubscriptionStatus());
+ final int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId();
+ try {
+ ConnectionManagerUtil.openDBConnection();
+ ApplicationReleaseDTO applicationReleaseDTO = applicationReleaseDAO.
+ getReleaseByUUID(subscriptionInfo.getApplicationUUID(), tenantId);
+ if (applicationReleaseDTO == null) {
+ String msg = "Couldn't find an application release for application release UUID: " +
+ subscriptionInfo.getApplicationUUID();
+ log.error(msg);
+ throw new NotFoundException(msg);
+ }
+ List subscriptionEntities = subscriptionDAO.
+ getGroupsSubscriptionDetailsByAppReleaseID(applicationReleaseDTO.getId(), isUnsubscribe, tenantId, offset, limit);
+ int subscriptionCount = isUnsubscribe ? subscriptionDAO.getGroupUnsubscriptionCount(applicationReleaseDTO.getId(), tenantId) :
+ subscriptionDAO.getGroupSubscriptionCount(applicationReleaseDTO.getId(), tenantId);
+ return new SubscriptionResponse(subscriptionInfo.getApplicationUUID(), subscriptionCount, subscriptionEntities);
+ } catch (DBConnectionException | ApplicationManagementDAOException e) {
+ String msg = "Error encountered while connecting to the database";
+ log.error(msg, e);
+ throw new ApplicationManagementException(msg, e);
+ } finally {
+ ConnectionManagerUtil.closeDBConnection();
+ }
+ }
+
+ @Override
+ public SubscriptionStatistics getSubscriptionStatistics(SubscriptionInfo subscriptionInfo)
+ throws ApplicationManagementException {
+ final boolean isUnsubscribe = Objects.equals(SubscriptionMetadata.SUBSCRIPTION_STATUS_UNSUBSCRIBED, subscriptionInfo.getSubscriptionStatus());
+ int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId();
+ try {
+ ConnectionManagerUtil.openDBConnection();
+ ApplicationReleaseDTO applicationReleaseDTO = applicationReleaseDAO.
+ getReleaseByUUID(subscriptionInfo.getApplicationUUID(), tenantId);
+ if (applicationReleaseDTO == null) {
+ String msg = "Couldn't find an application release for application release UUID: " +
+ subscriptionInfo.getApplicationUUID();
+ log.error(msg);
+ throw new NotFoundException(msg);
+ }
+ List devices = HelperUtil.getGroupManagementProviderService().
+ getAllDevicesOfGroup(subscriptionInfo.getIdentifier(), false);
+ List deviceIdsOwnByGroup = devices.stream().map(Device::getId).collect(Collectors.toList());
+ SubscriptionStatisticDTO subscriptionStatisticDTO = subscriptionDAO.
+ getSubscriptionStatistic(deviceIdsOwnByGroup, isUnsubscribe, tenantId, applicationReleaseDTO.getId());
+ int allDeviceCount = HelperUtil.getGroupManagementProviderService().getDeviceCount(subscriptionInfo.getIdentifier());
+ return SubscriptionManagementHelperUtil.getSubscriptionStatistics(subscriptionStatisticDTO, allDeviceCount);
+ } catch (ApplicationManagementDAOException e) {
+ String msg = "Error encountered while getting subscription statistics for group: " + subscriptionInfo.getIdentifier();
+ log.error(msg, e);
+ throw new ApplicationManagementException(msg, e);
+ } catch (GroupManagementException e) {
+ String msg = "Error encountered while getting device subscription for group: " + subscriptionInfo.getIdentifier();
+ log.error(msg, e);
+ throw new ApplicationManagementException(msg, e);
+ } finally {
+ ConnectionManagerUtil.closeDBConnection();
+ }
+ }
+
+ private static class GroupBasedSubscriptionManagementHelperServiceImplHolder {
+ private static final GroupBasedSubscriptionManagementHelperServiceImpl INSTANCE
+ = new GroupBasedSubscriptionManagementHelperServiceImpl();
+ }
+}
diff --git a/components/application-mgt/io.entgra.device.mgt.core.application.mgt.core/src/main/java/io/entgra/device/mgt/core/application/mgt/core/util/subscription/mgt/impl/RoleBasedSubscriptionManagementHelperServiceImpl.java b/components/application-mgt/io.entgra.device.mgt.core.application.mgt.core/src/main/java/io/entgra/device/mgt/core/application/mgt/core/util/subscription/mgt/impl/RoleBasedSubscriptionManagementHelperServiceImpl.java
new file mode 100644
index 0000000000..b667198fd5
--- /dev/null
+++ b/components/application-mgt/io.entgra.device.mgt.core.application.mgt.core/src/main/java/io/entgra/device/mgt/core/application/mgt/core/util/subscription/mgt/impl/RoleBasedSubscriptionManagementHelperServiceImpl.java
@@ -0,0 +1,227 @@
+/*
+ * Copyright (c) 2018 - 2024, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved.
+ *
+ * Entgra (Pvt) Ltd. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package io.entgra.device.mgt.core.application.mgt.core.util.subscription.mgt.impl;
+
+import io.entgra.device.mgt.core.application.mgt.common.DeviceSubscription;
+import io.entgra.device.mgt.core.application.mgt.common.DeviceSubscriptionFilterCriteria;
+import io.entgra.device.mgt.core.application.mgt.common.SubscriptionEntity;
+import io.entgra.device.mgt.core.application.mgt.common.SubscriptionInfo;
+import io.entgra.device.mgt.core.application.mgt.common.SubscriptionMetadata;
+import io.entgra.device.mgt.core.application.mgt.common.SubscriptionResponse;
+import io.entgra.device.mgt.core.application.mgt.common.SubscriptionStatistics;
+import io.entgra.device.mgt.core.application.mgt.common.dto.ApplicationDTO;
+import io.entgra.device.mgt.core.application.mgt.common.dto.ApplicationReleaseDTO;
+import io.entgra.device.mgt.core.application.mgt.common.dto.DeviceSubscriptionDTO;
+import io.entgra.device.mgt.core.application.mgt.common.dto.SubscriptionStatisticDTO;
+import io.entgra.device.mgt.core.application.mgt.common.exception.ApplicationManagementException;
+import io.entgra.device.mgt.core.application.mgt.common.exception.DBConnectionException;
+import io.entgra.device.mgt.core.application.mgt.core.exception.ApplicationManagementDAOException;
+import io.entgra.device.mgt.core.application.mgt.core.exception.NotFoundException;
+import io.entgra.device.mgt.core.application.mgt.core.internal.DataHolder;
+import io.entgra.device.mgt.core.application.mgt.core.util.ConnectionManagerUtil;
+import io.entgra.device.mgt.core.application.mgt.core.util.HelperUtil;
+import io.entgra.device.mgt.core.application.mgt.core.util.subscription.mgt.SubscriptionManagementHelperUtil;
+import io.entgra.device.mgt.core.application.mgt.core.util.subscription.mgt.service.SubscriptionManagementHelperService;
+import io.entgra.device.mgt.core.device.mgt.common.Device;
+import io.entgra.device.mgt.core.device.mgt.common.PaginationRequest;
+import io.entgra.device.mgt.core.device.mgt.common.PaginationResult;
+import io.entgra.device.mgt.core.device.mgt.common.exceptions.DeviceManagementException;
+import io.entgra.device.mgt.core.device.mgt.core.service.DeviceManagementProviderService;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.wso2.carbon.context.PrivilegedCarbonContext;
+import org.wso2.carbon.user.api.UserStoreException;
+import org.wso2.carbon.user.api.UserStoreManager;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+public class RoleBasedSubscriptionManagementHelperServiceImpl implements SubscriptionManagementHelperService {
+ private static final Log log = LogFactory.getLog(RoleBasedSubscriptionManagementHelperServiceImpl.class);
+
+ private RoleBasedSubscriptionManagementHelperServiceImpl() {
+ }
+
+ public static RoleBasedSubscriptionManagementHelperServiceImpl getInstance() {
+ return RoleBasedSubscriptionManagementHelperServiceImplHolder.INSTANCE;
+ }
+
+ @Override
+ public SubscriptionResponse getStatusBaseSubscriptions(SubscriptionInfo subscriptionInfo, int limit, int offset)
+ throws ApplicationManagementException {
+ final boolean isUnsubscribe = Objects.equals(SubscriptionMetadata.SUBSCRIPTION_STATUS_UNSUBSCRIBED, subscriptionInfo.getSubscriptionStatus());
+ List deviceSubscriptionDTOS;
+ int deviceCount = 0;
+ int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId();
+
+ try {
+ ConnectionManagerUtil.openDBConnection();
+ List deviceIdsOwnByRole = getDeviceIdsOwnByRole(subscriptionInfo.getIdentifier(), tenantId);
+
+ ApplicationReleaseDTO applicationReleaseDTO = applicationReleaseDAO.
+ getReleaseByUUID(subscriptionInfo.getApplicationUUID(), tenantId);
+ if (applicationReleaseDTO == null) {
+ String msg = "Couldn't find an application release for application release UUID: " +
+ subscriptionInfo.getApplicationUUID();
+ log.error(msg);
+ throw new NotFoundException(msg);
+ }
+
+ ApplicationDTO applicationDTO = this.applicationDAO.getAppWithRelatedRelease(subscriptionInfo.getApplicationUUID(), tenantId);
+ if (applicationDTO == null) {
+ String msg = "Application not found for the release UUID: " + subscriptionInfo.getApplicationUUID();
+ log.error(msg);
+ throw new NotFoundException(msg);
+ }
+
+ String deviceSubscriptionStatus = SubscriptionManagementHelperUtil.getDeviceSubscriptionStatus(subscriptionInfo);
+ DeviceSubscriptionFilterCriteria deviceSubscriptionFilterCriteria = subscriptionInfo.getDeviceSubscriptionFilterCriteria();
+ DeviceManagementProviderService deviceManagementProviderService = HelperUtil.getDeviceManagementProviderService();
+ List dbSubscriptionStatus = SubscriptionManagementHelperUtil.getDBSubscriptionStatus(subscriptionInfo.getDeviceSubscriptionStatus());
+
+ if (Objects.equals(SubscriptionMetadata.DeviceSubscriptionStatus.NEW, deviceSubscriptionStatus)) {
+ deviceSubscriptionDTOS = subscriptionDAO.getSubscriptionDetailsByDeviceIds(applicationReleaseDTO.getId(),
+ isUnsubscribe, tenantId, deviceIdsOwnByRole, null,
+ null, deviceSubscriptionFilterCriteria.getTriggeredBy(), -1, -1);
+
+ List deviceIdsOfSubscription = deviceSubscriptionDTOS.stream().
+ map(DeviceSubscriptionDTO::getDeviceId).collect(Collectors.toList());
+
+ for (Integer deviceId : deviceIdsOfSubscription) {
+ deviceIdsOwnByRole.remove(deviceId);
+ }
+
+ List newDeviceIds = deviceManagementProviderService.getDevicesInGivenIdList(deviceIdsOwnByRole);
+ deviceSubscriptionDTOS = newDeviceIds.stream().map(DeviceSubscriptionDTO::new).collect(Collectors.toList());
+ } else {
+ deviceSubscriptionDTOS = subscriptionDAO.getSubscriptionDetailsByDeviceIds(applicationReleaseDTO.getId(),
+ isUnsubscribe, tenantId, deviceIdsOwnByRole, dbSubscriptionStatus,
+ subscriptionInfo.getSubscriptionType(), deviceSubscriptionFilterCriteria.getTriggeredBy(), -1, -1);
+ }
+ deviceCount = SubscriptionManagementHelperUtil.getTotalDeviceSubscriptionCount(deviceSubscriptionDTOS,
+ subscriptionInfo.getDeviceSubscriptionFilterCriteria(), applicationDTO.getDeviceTypeId());
+
+ List deviceSubscriptions = SubscriptionManagementHelperUtil.
+ getDeviceSubscriptionData(deviceSubscriptionDTOS,
+ subscriptionInfo.getDeviceSubscriptionFilterCriteria(), isUnsubscribe, applicationDTO.getDeviceTypeId(), limit, offset);
+ return new SubscriptionResponse(subscriptionInfo.getApplicationUUID(), deviceCount, deviceSubscriptions);
+
+ } catch (UserStoreException e) {
+ String msg = "Error encountered while getting the user management store for tenant id " + tenantId;
+ log.error(msg, e);
+ throw new ApplicationManagementException(msg, e);
+ } catch (DeviceManagementException e) {
+ String msg = "Error encountered while getting device details";
+ log.error(msg, e);
+ throw new ApplicationManagementException(msg, e);
+ } catch (ApplicationManagementDAOException | DBConnectionException e) {
+ String msg = "Error encountered while connecting to the database";
+ log.error(msg, e);
+ throw new ApplicationManagementException(msg, e);
+ } finally {
+ ConnectionManagerUtil.closeDBConnection();
+ }
+ }
+
+ @Override
+ public SubscriptionResponse getSubscriptions(SubscriptionInfo subscriptionInfo, int limit, int offset)
+ throws ApplicationManagementException {
+ final boolean isUnsubscribe = Objects.equals(SubscriptionMetadata.SUBSCRIPTION_STATUS_UNSUBSCRIBED, subscriptionInfo.getSubscriptionStatus());
+ final int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId();
+ try {
+ ConnectionManagerUtil.openDBConnection();
+ ApplicationReleaseDTO applicationReleaseDTO = applicationReleaseDAO.
+ getReleaseByUUID(subscriptionInfo.getApplicationUUID(), tenantId);
+ if (applicationReleaseDTO == null) {
+ String msg = "Couldn't find an application release for application release UUID: " +
+ subscriptionInfo.getApplicationUUID();
+ log.error(msg);
+ throw new NotFoundException(msg);
+ }
+ List subscriptionEntities = subscriptionDAO.
+ getRoleSubscriptionsByAppReleaseID(applicationReleaseDTO.getId(), isUnsubscribe, tenantId, offset, limit);
+ int subscriptionCount = isUnsubscribe ? subscriptionDAO.getRoleUnsubscriptionCount(applicationReleaseDTO.getId(), tenantId) :
+ subscriptionDAO.getRoleSubscriptionCount(applicationReleaseDTO.getId(), tenantId);
+ return new SubscriptionResponse(subscriptionInfo.getApplicationUUID(), subscriptionCount, subscriptionEntities);
+ } catch (DBConnectionException | ApplicationManagementDAOException e) {
+ String msg = "Error encountered while connecting to the database";
+ log.error(msg, e);
+ throw new ApplicationManagementException(msg, e);
+ } finally {
+ ConnectionManagerUtil.closeDBConnection();
+ }
+ }
+
+ @Override
+ public SubscriptionStatistics getSubscriptionStatistics(SubscriptionInfo subscriptionInfo) throws ApplicationManagementException {
+ final boolean isUnsubscribe = Objects.equals(SubscriptionMetadata.SUBSCRIPTION_STATUS_UNSUBSCRIBED, subscriptionInfo.getSubscriptionStatus());
+ int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId();
+ try {
+ ConnectionManagerUtil.openDBConnection();
+ ApplicationReleaseDTO applicationReleaseDTO = applicationReleaseDAO.
+ getReleaseByUUID(subscriptionInfo.getApplicationUUID(), tenantId);
+ if (applicationReleaseDTO == null) {
+ String msg = "Couldn't find an application release for application release UUID: " +
+ subscriptionInfo.getApplicationUUID();
+ log.error(msg);
+ throw new NotFoundException(msg);
+ }
+ List deviceIdsOwnByRole = getDeviceIdsOwnByRole(subscriptionInfo.getIdentifier(), tenantId);
+ SubscriptionStatisticDTO subscriptionStatisticDTO = subscriptionDAO.
+ getSubscriptionStatistic(deviceIdsOwnByRole, isUnsubscribe, tenantId, applicationReleaseDTO.getId());
+ int allDeviceCount = deviceIdsOwnByRole.size();
+ return SubscriptionManagementHelperUtil.getSubscriptionStatistics(subscriptionStatisticDTO, allDeviceCount);
+ } catch (DeviceManagementException | ApplicationManagementDAOException | UserStoreException e) {
+ String msg = "Error encountered while getting subscription statistics for role: " + subscriptionInfo.getIdentifier();
+ log.error(msg, e);
+ throw new ApplicationManagementException(msg, e);
+ } finally {
+ ConnectionManagerUtil.closeDBConnection();
+ }
+ }
+
+ @SuppressWarnings("unchecked")
+ private List getDeviceIdsOwnByRole(String roleName, int tenantId) throws UserStoreException, DeviceManagementException {
+ UserStoreManager userStoreManager = DataHolder.getInstance().getRealmService().
+ getTenantUserRealm(tenantId).getUserStoreManager();
+ String[] usersWithRole =
+ userStoreManager.getUserListOfRole(roleName);
+ List deviceListOwnByRole = new ArrayList<>();
+ for (String user : usersWithRole) {
+ PaginationRequest paginationRequest = new PaginationRequest(-1, -1);
+ paginationRequest.setOwner(user);
+ paginationRequest.setStatusList(Arrays.asList("ACTIVE", "INACTIVE", "UNREACHABLE"));
+ PaginationResult ownDeviceIds = HelperUtil.getDeviceManagementProviderService().
+ getAllDevicesIdList(paginationRequest);
+ if (ownDeviceIds.getData() != null) {
+ deviceListOwnByRole.addAll((List) ownDeviceIds.getData());
+ }
+ }
+ return deviceListOwnByRole.stream().map(Device::getId).collect(Collectors.toList());
+ }
+
+ private static class RoleBasedSubscriptionManagementHelperServiceImplHolder {
+ private static final RoleBasedSubscriptionManagementHelperServiceImpl INSTANCE
+ = new RoleBasedSubscriptionManagementHelperServiceImpl();
+ }
+}
diff --git a/components/application-mgt/io.entgra.device.mgt.core.application.mgt.core/src/main/java/io/entgra/device/mgt/core/application/mgt/core/util/subscription/mgt/impl/UserBasedSubscriptionManagementHelperServiceImpl.java b/components/application-mgt/io.entgra.device.mgt.core.application.mgt.core/src/main/java/io/entgra/device/mgt/core/application/mgt/core/util/subscription/mgt/impl/UserBasedSubscriptionManagementHelperServiceImpl.java
new file mode 100644
index 0000000000..b8978b1c7a
--- /dev/null
+++ b/components/application-mgt/io.entgra.device.mgt.core.application.mgt.core/src/main/java/io/entgra/device/mgt/core/application/mgt/core/util/subscription/mgt/impl/UserBasedSubscriptionManagementHelperServiceImpl.java
@@ -0,0 +1,212 @@
+/*
+ * Copyright (c) 2018 - 2024, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved.
+ *
+ * Entgra (Pvt) Ltd. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package io.entgra.device.mgt.core.application.mgt.core.util.subscription.mgt.impl;
+
+import io.entgra.device.mgt.core.application.mgt.common.DeviceSubscription;
+import io.entgra.device.mgt.core.application.mgt.common.DeviceSubscriptionFilterCriteria;
+import io.entgra.device.mgt.core.application.mgt.common.SubscriptionEntity;
+import io.entgra.device.mgt.core.application.mgt.common.SubscriptionInfo;
+import io.entgra.device.mgt.core.application.mgt.common.SubscriptionMetadata;
+import io.entgra.device.mgt.core.application.mgt.common.SubscriptionResponse;
+import io.entgra.device.mgt.core.application.mgt.common.SubscriptionStatistics;
+import io.entgra.device.mgt.core.application.mgt.common.dto.ApplicationDTO;
+import io.entgra.device.mgt.core.application.mgt.common.dto.ApplicationReleaseDTO;
+import io.entgra.device.mgt.core.application.mgt.common.dto.DeviceSubscriptionDTO;
+import io.entgra.device.mgt.core.application.mgt.common.dto.SubscriptionStatisticDTO;
+import io.entgra.device.mgt.core.application.mgt.common.exception.ApplicationManagementException;
+import io.entgra.device.mgt.core.application.mgt.common.exception.DBConnectionException;
+import io.entgra.device.mgt.core.application.mgt.core.exception.ApplicationManagementDAOException;
+import io.entgra.device.mgt.core.application.mgt.core.exception.NotFoundException;
+import io.entgra.device.mgt.core.application.mgt.core.util.ConnectionManagerUtil;
+import io.entgra.device.mgt.core.application.mgt.core.util.HelperUtil;
+import io.entgra.device.mgt.core.application.mgt.core.util.subscription.mgt.SubscriptionManagementHelperUtil;
+import io.entgra.device.mgt.core.application.mgt.core.util.subscription.mgt.service.SubscriptionManagementHelperService;
+import io.entgra.device.mgt.core.device.mgt.common.Device;
+import io.entgra.device.mgt.core.device.mgt.common.PaginationRequest;
+import io.entgra.device.mgt.core.device.mgt.common.PaginationResult;
+import io.entgra.device.mgt.core.device.mgt.common.exceptions.DeviceManagementException;
+import io.entgra.device.mgt.core.device.mgt.core.service.DeviceManagementProviderService;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.wso2.carbon.context.PrivilegedCarbonContext;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+public class UserBasedSubscriptionManagementHelperServiceImpl implements SubscriptionManagementHelperService {
+ private static final Log log = LogFactory.getLog(UserBasedSubscriptionManagementHelperServiceImpl.class);
+
+ private UserBasedSubscriptionManagementHelperServiceImpl() {
+ }
+
+ public static UserBasedSubscriptionManagementHelperServiceImpl getInstance() {
+ return UserBasedSubscriptionManagementHelperServiceImpl.UserBasedSubscriptionManagementHelperServiceImplHolder.INSTANCE;
+ }
+
+ @Override
+ public SubscriptionResponse getStatusBaseSubscriptions(SubscriptionInfo subscriptionInfo, int limit, int offset)
+ throws ApplicationManagementException {
+ final boolean isUnsubscribe = Objects.equals(SubscriptionMetadata.SUBSCRIPTION_STATUS_UNSUBSCRIBED, subscriptionInfo.getSubscriptionStatus());
+ List deviceSubscriptionDTOS;
+ int deviceCount = 0;
+ int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId();
+
+ try {
+ ConnectionManagerUtil.openDBConnection();
+ List deviceIdsOwnByUser = getDeviceIdsOwnByUser(subscriptionInfo.getIdentifier());
+
+ ApplicationReleaseDTO applicationReleaseDTO = applicationReleaseDAO.
+ getReleaseByUUID(subscriptionInfo.getApplicationUUID(), tenantId);
+ if (applicationReleaseDTO == null) {
+ String msg = "Couldn't find an application release for application release UUID: " +
+ subscriptionInfo.getApplicationUUID();
+ log.error(msg);
+ throw new NotFoundException(msg);
+ }
+
+ ApplicationDTO applicationDTO = this.applicationDAO.getAppWithRelatedRelease(subscriptionInfo.getApplicationUUID(), tenantId);
+ if (applicationDTO == null) {
+ String msg = "Application not found for the release UUID: " + subscriptionInfo.getApplicationUUID();
+ log.error(msg);
+ throw new NotFoundException(msg);
+ }
+
+ String deviceSubscriptionStatus = SubscriptionManagementHelperUtil.getDeviceSubscriptionStatus(subscriptionInfo);
+ DeviceSubscriptionFilterCriteria deviceSubscriptionFilterCriteria = subscriptionInfo.getDeviceSubscriptionFilterCriteria();
+ DeviceManagementProviderService deviceManagementProviderService = HelperUtil.getDeviceManagementProviderService();
+ List dbSubscriptionStatus = SubscriptionManagementHelperUtil.getDBSubscriptionStatus(subscriptionInfo.getDeviceSubscriptionStatus());
+
+ if (Objects.equals(SubscriptionMetadata.DeviceSubscriptionStatus.NEW, deviceSubscriptionStatus)) {
+ deviceSubscriptionDTOS = subscriptionDAO.getSubscriptionDetailsByDeviceIds(applicationReleaseDTO.getId(),
+ isUnsubscribe, tenantId, deviceIdsOwnByUser, null,
+ null, deviceSubscriptionFilterCriteria.getTriggeredBy(), -1, -1);
+
+ List deviceIdsOfSubscription = deviceSubscriptionDTOS.stream().
+ map(DeviceSubscriptionDTO::getDeviceId).collect(Collectors.toList());
+
+ for (Integer deviceId : deviceIdsOfSubscription) {
+ deviceIdsOwnByUser.remove(deviceId);
+ }
+ List newDeviceIds = deviceManagementProviderService.getDevicesInGivenIdList(deviceIdsOwnByUser);
+ deviceSubscriptionDTOS = newDeviceIds.stream().map(DeviceSubscriptionDTO::new).collect(Collectors.toList());
+
+ } else {
+ deviceSubscriptionDTOS = subscriptionDAO.getSubscriptionDetailsByDeviceIds(applicationReleaseDTO.getId(),
+ isUnsubscribe, tenantId, deviceIdsOwnByUser, dbSubscriptionStatus,
+ null, deviceSubscriptionFilterCriteria.getTriggeredBy(), -1, -1);
+ }
+ deviceCount = SubscriptionManagementHelperUtil.getTotalDeviceSubscriptionCount(deviceSubscriptionDTOS,
+ subscriptionInfo.getDeviceSubscriptionFilterCriteria(), applicationDTO.getDeviceTypeId());
+
+ List deviceSubscriptions = SubscriptionManagementHelperUtil.getDeviceSubscriptionData(deviceSubscriptionDTOS,
+ subscriptionInfo.getDeviceSubscriptionFilterCriteria(), isUnsubscribe, applicationDTO.getDeviceTypeId(), limit, offset);
+ return new SubscriptionResponse(subscriptionInfo.getApplicationUUID(), deviceCount, deviceSubscriptions);
+ } catch (DeviceManagementException e) {
+ String msg = "Error encountered while getting device details";
+ log.error(msg, e);
+ throw new ApplicationManagementException(msg, e);
+ } catch (ApplicationManagementDAOException | DBConnectionException e) {
+ String msg = "Error encountered while connecting to the database";
+ log.error(msg, e);
+ throw new ApplicationManagementException(msg, e);
+ } finally {
+ ConnectionManagerUtil.closeDBConnection();
+ }
+ }
+
+ @Override
+ public SubscriptionResponse getSubscriptions(SubscriptionInfo subscriptionInfo, int limit, int offset)
+ throws ApplicationManagementException {
+ final boolean isUnsubscribe = Objects.equals(SubscriptionMetadata.SUBSCRIPTION_STATUS_UNSUBSCRIBED, subscriptionInfo.getSubscriptionStatus());
+ final int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId();
+ try {
+ ConnectionManagerUtil.openDBConnection();
+ ApplicationReleaseDTO applicationReleaseDTO = applicationReleaseDAO.
+ getReleaseByUUID(subscriptionInfo.getApplicationUUID(), tenantId);
+ if (applicationReleaseDTO == null) {
+ String msg = "Couldn't find an application release for application release UUID: " +
+ subscriptionInfo.getApplicationUUID();
+ log.error(msg);
+ throw new NotFoundException(msg);
+ }
+ List subscriptionEntities = subscriptionDAO.
+ getUserSubscriptionsByAppReleaseID(applicationReleaseDTO.getId(), isUnsubscribe, tenantId, offset, limit);
+ int subscriptionCount = isUnsubscribe ? subscriptionDAO.getUserUnsubscriptionCount(applicationReleaseDTO.getId(), tenantId) :
+ subscriptionDAO.getUserSubscriptionCount(applicationReleaseDTO.getId(), tenantId);
+ return new SubscriptionResponse(subscriptionInfo.getApplicationUUID(), subscriptionCount, subscriptionEntities);
+ } catch (DBConnectionException | ApplicationManagementDAOException e) {
+ String msg = "Error encountered while connecting to the database";
+ log.error(msg, e);
+ throw new ApplicationManagementException(msg, e);
+ } finally {
+ ConnectionManagerUtil.closeDBConnection();
+ }
+ }
+
+ @Override
+ public SubscriptionStatistics getSubscriptionStatistics(SubscriptionInfo subscriptionInfo) throws ApplicationManagementException {
+ final boolean isUnsubscribe = Objects.equals(SubscriptionMetadata.SUBSCRIPTION_STATUS_UNSUBSCRIBED, subscriptionInfo.getSubscriptionStatus());
+ int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId();
+ try {
+ ConnectionManagerUtil.openDBConnection();
+ ApplicationReleaseDTO applicationReleaseDTO = applicationReleaseDAO.
+ getReleaseByUUID(subscriptionInfo.getApplicationUUID(), tenantId);
+ if (applicationReleaseDTO == null) {
+ String msg = "Couldn't find an application release for application release UUID: " +
+ subscriptionInfo.getApplicationUUID();
+ log.error(msg);
+ throw new NotFoundException(msg);
+ }
+ List deviceIdsOwnByUser = getDeviceIdsOwnByUser(subscriptionInfo.getIdentifier());
+ SubscriptionStatisticDTO subscriptionStatisticDTO = subscriptionDAO.
+ getSubscriptionStatistic(deviceIdsOwnByUser, isUnsubscribe, tenantId, applicationReleaseDTO.getId());
+ int allDeviceCount = deviceIdsOwnByUser.size();
+ return SubscriptionManagementHelperUtil.getSubscriptionStatistics(subscriptionStatisticDTO, allDeviceCount);
+ } catch (DeviceManagementException | ApplicationManagementDAOException e) {
+ String msg = "Error encountered while getting subscription statistics for user: " + subscriptionInfo.getIdentifier();
+ log.error(msg, e);
+ throw new ApplicationManagementException(msg, e);
+ } finally {
+ ConnectionManagerUtil.closeDBConnection();
+ }
+ }
+
+ @SuppressWarnings("unchecked")
+ private List getDeviceIdsOwnByUser(String username) throws DeviceManagementException {
+ List deviceListOwnByUser = new ArrayList<>();
+ PaginationRequest paginationRequest = new PaginationRequest(-1, -1);
+ paginationRequest.setOwner(username);
+ paginationRequest.setStatusList(Arrays.asList("ACTIVE", "INACTIVE", "UNREACHABLE"));
+ PaginationResult ownDeviceIds = HelperUtil.getDeviceManagementProviderService().
+ getAllDevicesIdList(paginationRequest);
+ if (ownDeviceIds.getData() != null) {
+ deviceListOwnByUser.addAll((List) ownDeviceIds.getData());
+ }
+ return deviceListOwnByUser.stream().map(Device::getId).collect(Collectors.toList());
+ }
+
+ private static class UserBasedSubscriptionManagementHelperServiceImplHolder {
+ private static final UserBasedSubscriptionManagementHelperServiceImpl INSTANCE
+ = new UserBasedSubscriptionManagementHelperServiceImpl();
+ }
+}
diff --git a/components/application-mgt/io.entgra.device.mgt.core.application.mgt.core/src/main/java/io/entgra/device/mgt/core/application/mgt/core/util/subscription/mgt/service/SubscriptionManagementHelperService.java b/components/application-mgt/io.entgra.device.mgt.core.application.mgt.core/src/main/java/io/entgra/device/mgt/core/application/mgt/core/util/subscription/mgt/service/SubscriptionManagementHelperService.java
new file mode 100644
index 0000000000..f869e282dd
--- /dev/null
+++ b/components/application-mgt/io.entgra.device.mgt.core.application.mgt.core/src/main/java/io/entgra/device/mgt/core/application/mgt/core/util/subscription/mgt/service/SubscriptionManagementHelperService.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright (c) 2018 - 2024, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved.
+ *
+ * Entgra (Pvt) Ltd. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package io.entgra.device.mgt.core.application.mgt.core.util.subscription.mgt.service;
+
+import io.entgra.device.mgt.core.application.mgt.common.SubscriptionInfo;
+import io.entgra.device.mgt.core.application.mgt.common.SubscriptionResponse;
+import io.entgra.device.mgt.core.application.mgt.common.SubscriptionStatistics;
+import io.entgra.device.mgt.core.application.mgt.common.exception.ApplicationManagementException;
+import io.entgra.device.mgt.core.application.mgt.core.dao.ApplicationDAO;
+import io.entgra.device.mgt.core.application.mgt.core.dao.ApplicationReleaseDAO;
+import io.entgra.device.mgt.core.application.mgt.core.dao.SubscriptionDAO;
+import io.entgra.device.mgt.core.application.mgt.core.dao.common.ApplicationManagementDAOFactory;
+
+public interface SubscriptionManagementHelperService {
+ SubscriptionDAO subscriptionDAO = ApplicationManagementDAOFactory.getSubscriptionDAO();
+ ApplicationDAO applicationDAO = ApplicationManagementDAOFactory.getApplicationDAO();
+ ApplicationReleaseDAO applicationReleaseDAO = ApplicationManagementDAOFactory.getApplicationReleaseDAO();
+
+ SubscriptionResponse getStatusBaseSubscriptions(SubscriptionInfo subscriptionInfo, int limit, int offset)
+ throws ApplicationManagementException;
+
+ SubscriptionResponse getSubscriptions(SubscriptionInfo subscriptionInfo, int limit, int offset)
+ throws ApplicationManagementException;
+
+ SubscriptionStatistics getSubscriptionStatistics(SubscriptionInfo subscriptionInfo)
+ throws ApplicationManagementException;
+}
diff --git a/components/application-mgt/pom.xml b/components/application-mgt/pom.xml
index 6d7cc6ff64..c4a50c3705 100644
--- a/components/application-mgt/pom.xml
+++ b/components/application-mgt/pom.xml
@@ -22,7 +22,7 @@
io.entgra.device.mgt.core
io.entgra.device.mgt.core.parent
- 5.2.1-SNAPSHOT
+ 5.2.4-SNAPSHOT
../../pom.xml
diff --git a/components/cea-mgt/io.entgra.device.mgt.core.cea.mgt.admin.api/pom.xml b/components/cea-mgt/io.entgra.device.mgt.core.cea.mgt.admin.api/pom.xml
index 25ecdcbe7e..c75eae5479 100644
--- a/components/cea-mgt/io.entgra.device.mgt.core.cea.mgt.admin.api/pom.xml
+++ b/components/cea-mgt/io.entgra.device.mgt.core.cea.mgt.admin.api/pom.xml
@@ -22,7 +22,7 @@
io.entgra.device.mgt.core
cea-mgt
- 5.2.1-SNAPSHOT
+ 5.2.4-SNAPSHOT
../pom.xml
diff --git a/components/cea-mgt/io.entgra.device.mgt.core.cea.mgt.common/pom.xml b/components/cea-mgt/io.entgra.device.mgt.core.cea.mgt.common/pom.xml
index c5466dc7f0..9e8060e0b8 100644
--- a/components/cea-mgt/io.entgra.device.mgt.core.cea.mgt.common/pom.xml
+++ b/components/cea-mgt/io.entgra.device.mgt.core.cea.mgt.common/pom.xml
@@ -23,7 +23,7 @@
io.entgra.device.mgt.core
cea-mgt
- 5.2.1-SNAPSHOT
+ 5.2.4-SNAPSHOT
../pom.xml
diff --git a/components/cea-mgt/io.entgra.device.mgt.core.cea.mgt.core/pom.xml b/components/cea-mgt/io.entgra.device.mgt.core.cea.mgt.core/pom.xml
index 14d499185b..a09c92436a 100644
--- a/components/cea-mgt/io.entgra.device.mgt.core.cea.mgt.core/pom.xml
+++ b/components/cea-mgt/io.entgra.device.mgt.core.cea.mgt.core/pom.xml
@@ -22,7 +22,7 @@
io.entgra.device.mgt.core
cea-mgt
- 5.2.1-SNAPSHOT
+ 5.2.4-SNAPSHOT
../pom.xml
diff --git a/components/cea-mgt/io.entgra.device.mgt.core.cea.mgt.enforce/pom.xml b/components/cea-mgt/io.entgra.device.mgt.core.cea.mgt.enforce/pom.xml
index a79256a668..c22f147d82 100644
--- a/components/cea-mgt/io.entgra.device.mgt.core.cea.mgt.enforce/pom.xml
+++ b/components/cea-mgt/io.entgra.device.mgt.core.cea.mgt.enforce/pom.xml
@@ -22,7 +22,7 @@
io.entgra.device.mgt.core
cea-mgt
- 5.2.1-SNAPSHOT
+ 5.2.4-SNAPSHOT
../pom.xml
diff --git a/components/cea-mgt/pom.xml b/components/cea-mgt/pom.xml
index 136bb3c064..78b391bd6b 100644
--- a/components/cea-mgt/pom.xml
+++ b/components/cea-mgt/pom.xml
@@ -22,7 +22,7 @@
io.entgra.device.mgt.core
io.entgra.device.mgt.core.parent
- 5.2.1-SNAPSHOT
+ 5.2.4-SNAPSHOT
../../pom.xml
diff --git a/components/certificate-mgt/io.entgra.device.mgt.core.certificate.mgt.api/pom.xml b/components/certificate-mgt/io.entgra.device.mgt.core.certificate.mgt.api/pom.xml
index b90b59da0f..bf1dee7058 100644
--- a/components/certificate-mgt/io.entgra.device.mgt.core.certificate.mgt.api/pom.xml
+++ b/components/certificate-mgt/io.entgra.device.mgt.core.certificate.mgt.api/pom.xml
@@ -22,7 +22,7 @@
certificate-mgt
io.entgra.device.mgt.core
- 5.2.1-SNAPSHOT
+ 5.2.4-SNAPSHOT
../pom.xml
diff --git a/components/certificate-mgt/io.entgra.device.mgt.core.certificate.mgt.cert.admin.api/pom.xml b/components/certificate-mgt/io.entgra.device.mgt.core.certificate.mgt.cert.admin.api/pom.xml
index 2245b8ff97..3f9de89f2d 100644
--- a/components/certificate-mgt/io.entgra.device.mgt.core.certificate.mgt.cert.admin.api/pom.xml
+++ b/components/certificate-mgt/io.entgra.device.mgt.core.certificate.mgt.cert.admin.api/pom.xml
@@ -22,7 +22,7 @@
certificate-mgt
io.entgra.device.mgt.core
- 5.2.1-SNAPSHOT
+ 5.2.4-SNAPSHOT
../pom.xml
diff --git a/components/certificate-mgt/io.entgra.device.mgt.core.certificate.mgt.core/pom.xml b/components/certificate-mgt/io.entgra.device.mgt.core.certificate.mgt.core/pom.xml
index 81bf0a8650..ff7cc19498 100644
--- a/components/certificate-mgt/io.entgra.device.mgt.core.certificate.mgt.core/pom.xml
+++ b/components/certificate-mgt/io.entgra.device.mgt.core.certificate.mgt.core/pom.xml
@@ -21,7 +21,7 @@
io.entgra.device.mgt.core
certificate-mgt
- 5.2.1-SNAPSHOT
+ 5.2.4-SNAPSHOT
../pom.xml
diff --git a/components/certificate-mgt/pom.xml b/components/certificate-mgt/pom.xml
index f2e8c1610c..c733f7e373 100644
--- a/components/certificate-mgt/pom.xml
+++ b/components/certificate-mgt/pom.xml
@@ -22,7 +22,7 @@
io.entgra.device.mgt.core
io.entgra.device.mgt.core.parent
- 5.2.1-SNAPSHOT
+ 5.2.4-SNAPSHOT
../../pom.xml
diff --git a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.defaultrole.manager/pom.xml b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.defaultrole.manager/pom.xml
index 4b8ca7f4f0..888af70f81 100644
--- a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.defaultrole.manager/pom.xml
+++ b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.defaultrole.manager/pom.xml
@@ -22,7 +22,7 @@
device-mgt-extensions
io.entgra.device.mgt.core
- 5.2.1-SNAPSHOT
+ 5.2.4-SNAPSHOT
../pom.xml
diff --git a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization.api/pom.xml b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization.api/pom.xml
index 0975938a13..3cc512d792 100644
--- a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization.api/pom.xml
+++ b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization.api/pom.xml
@@ -22,7 +22,7 @@
device-mgt-extensions
io.entgra.device.mgt.core
- 5.2.1-SNAPSHOT
+ 5.2.4-SNAPSHOT
../pom.xml
diff --git a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/pom.xml b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/pom.xml
index de84f1ddfe..61480722b1 100644
--- a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/pom.xml
+++ b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/pom.xml
@@ -22,7 +22,7 @@
device-mgt-extensions
io.entgra.device.mgt.core
- 5.2.1-SNAPSHOT
+ 5.2.4-SNAPSHOT
../pom.xml
diff --git a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.type.deployer/pom.xml b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.type.deployer/pom.xml
index 5637218576..2a04b62e41 100644
--- a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.type.deployer/pom.xml
+++ b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.type.deployer/pom.xml
@@ -22,7 +22,7 @@
device-mgt-extensions
io.entgra.device.mgt.core
- 5.2.1-SNAPSHOT
+ 5.2.4-SNAPSHOT
../pom.xml
diff --git a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.logger/pom.xml b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.logger/pom.xml
index 75b6a35f6d..aa4b2c1cf1 100644
--- a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.logger/pom.xml
+++ b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.logger/pom.xml
@@ -21,7 +21,7 @@
device-mgt-extensions
io.entgra.device.mgt.core
- 5.2.1-SNAPSHOT
+ 5.2.4-SNAPSHOT
../pom.xml
diff --git a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.pull.notification/pom.xml b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.pull.notification/pom.xml
index 9f09be37c4..d1ea2bc255 100644
--- a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.pull.notification/pom.xml
+++ b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.pull.notification/pom.xml
@@ -22,7 +22,7 @@
device-mgt-extensions
io.entgra.device.mgt.core
- 5.2.1-SNAPSHOT
+ 5.2.4-SNAPSHOT
../pom.xml
diff --git a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.push.notification.provider.fcm/pom.xml b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.push.notification.provider.fcm/pom.xml
index 99da81006e..3d124d95d9 100644
--- a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.push.notification.provider.fcm/pom.xml
+++ b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.push.notification.provider.fcm/pom.xml
@@ -22,7 +22,7 @@
device-mgt-extensions
io.entgra.device.mgt.core
- 5.2.1-SNAPSHOT
+ 5.2.4-SNAPSHOT
../pom.xml
diff --git a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.push.notification.provider.http/pom.xml b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.push.notification.provider.http/pom.xml
index c82088c95e..1ae1b328cf 100644
--- a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.push.notification.provider.http/pom.xml
+++ b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.push.notification.provider.http/pom.xml
@@ -22,7 +22,7 @@
device-mgt-extensions
io.entgra.device.mgt.core
- 5.2.1-SNAPSHOT
+ 5.2.4-SNAPSHOT
../pom.xml
diff --git a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.push.notification.provider.mqtt/pom.xml b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.push.notification.provider.mqtt/pom.xml
index 1294956cb4..0477011b9f 100644
--- a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.push.notification.provider.mqtt/pom.xml
+++ b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.push.notification.provider.mqtt/pom.xml
@@ -22,7 +22,7 @@
device-mgt-extensions
io.entgra.device.mgt.core
- 5.2.1-SNAPSHOT
+ 5.2.4-SNAPSHOT
../pom.xml
diff --git a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.push.notification.provider.xmpp/pom.xml b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.push.notification.provider.xmpp/pom.xml
index e08cbaa464..d22a7befe7 100644
--- a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.push.notification.provider.xmpp/pom.xml
+++ b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.push.notification.provider.xmpp/pom.xml
@@ -22,7 +22,7 @@
device-mgt-extensions
io.entgra.device.mgt.core
- 5.2.1-SNAPSHOT
+ 5.2.4-SNAPSHOT
../pom.xml
diff --git a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.stateengine/pom.xml b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.stateengine/pom.xml
index 0fc409a036..3cc4114dc9 100644
--- a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.stateengine/pom.xml
+++ b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.stateengine/pom.xml
@@ -22,7 +22,7 @@
device-mgt-extensions
io.entgra.device.mgt.core
- 5.2.1-SNAPSHOT
+ 5.2.4-SNAPSHOT
../pom.xml
diff --git a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.userstore.role.mapper/pom.xml b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.userstore.role.mapper/pom.xml
index 7c52a72671..a6b55859df 100644
--- a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.userstore.role.mapper/pom.xml
+++ b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.userstore.role.mapper/pom.xml
@@ -22,7 +22,7 @@
device-mgt-extensions
io.entgra.device.mgt.core
- 5.2.1-SNAPSHOT
+ 5.2.4-SNAPSHOT
../pom.xml
diff --git a/components/device-mgt-extensions/pom.xml b/components/device-mgt-extensions/pom.xml
index e669fefc55..455aa0679c 100644
--- a/components/device-mgt-extensions/pom.xml
+++ b/components/device-mgt-extensions/pom.xml
@@ -22,7 +22,7 @@
io.entgra.device.mgt.core.parent
io.entgra.device.mgt.core
- 5.2.1-SNAPSHOT
+ 5.2.4-SNAPSHOT
../../pom.xml
diff --git a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/pom.xml b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/pom.xml
index 48a0429350..6ce3f3e666 100644
--- a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/pom.xml
+++ b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/pom.xml
@@ -22,7 +22,7 @@
device-mgt
io.entgra.device.mgt.core
- 5.2.1-SNAPSHOT
+ 5.2.4-SNAPSHOT
../pom.xml
diff --git a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/beans/ApplicationUninstallation.java b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/beans/ApplicationUninstallation.java
index f78d15966e..eee5f06c49 100644
--- a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/beans/ApplicationUninstallation.java
+++ b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/beans/ApplicationUninstallation.java
@@ -18,6 +18,7 @@
package io.entgra.device.mgt.core.device.mgt.api.jaxrs.beans;
+import com.google.gson.Gson;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
@@ -113,4 +114,8 @@ public class ApplicationUninstallation {
public void setType(String type) {
this.type = type;
}
+
+ public String toJson() {
+ return new Gson().toJson(this);
+ }
}
diff --git a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/impl/DeviceManagementServiceImpl.java b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/impl/DeviceManagementServiceImpl.java
index 39ed4f86e3..bd614f5b1e 100644
--- a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/impl/DeviceManagementServiceImpl.java
+++ b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/impl/DeviceManagementServiceImpl.java
@@ -43,14 +43,25 @@ import io.entgra.device.mgt.core.application.mgt.common.services.SubscriptionMan
import io.entgra.device.mgt.core.application.mgt.core.util.HelperUtil;
import io.entgra.device.mgt.core.device.mgt.api.jaxrs.service.impl.util.DisenrollRequest;
import io.entgra.device.mgt.core.device.mgt.api.jaxrs.util.DeviceMgtUtil;
+import io.entgra.device.mgt.core.device.mgt.common.Device;
+import io.entgra.device.mgt.core.device.mgt.common.DeviceFilters;
+import io.entgra.device.mgt.core.device.mgt.common.DeviceIdentifier;
+import io.entgra.device.mgt.core.device.mgt.common.DeviceManagementConstants;
+import io.entgra.device.mgt.core.device.mgt.common.EnrolmentInfo;
+import io.entgra.device.mgt.core.device.mgt.common.Feature;
+import io.entgra.device.mgt.core.device.mgt.common.FeatureManager;
+import io.entgra.device.mgt.core.device.mgt.common.MDMAppConstants;
+import io.entgra.device.mgt.core.device.mgt.common.OperationLogFilters;
+import io.entgra.device.mgt.core.device.mgt.common.PaginationRequest;
+import io.entgra.device.mgt.core.device.mgt.common.PaginationResult;
import io.entgra.device.mgt.core.device.mgt.core.permission.mgt.PermissionManagerServiceImpl;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
-import io.entgra.device.mgt.core.device.mgt.common.*;
import io.entgra.device.mgt.core.device.mgt.common.app.mgt.Application;
import io.entgra.device.mgt.core.device.mgt.common.app.mgt.ApplicationManagementException;
+import io.entgra.device.mgt.core.device.mgt.common.app.mgt.MobileAppTypes;
import io.entgra.device.mgt.core.device.mgt.common.authorization.DeviceAccessAuthorizationException;
import io.entgra.device.mgt.core.device.mgt.common.authorization.DeviceAccessAuthorizationService;
import io.entgra.device.mgt.core.device.mgt.common.device.details.DeviceData;
@@ -104,7 +115,16 @@ import org.wso2.carbon.utils.multitenancy.MultitenantUtils;
import javax.validation.Valid;
import javax.validation.constraints.Size;
-import javax.ws.rs.*;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.DELETE;
+import javax.ws.rs.DefaultValue;
+import javax.ws.rs.GET;
+import javax.ws.rs.HeaderParam;
+import javax.ws.rs.POST;
+import javax.ws.rs.PUT;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.QueryParam;
import javax.ws.rs.core.Response;
import java.io.IOException;
import java.text.ParseException;
@@ -1161,7 +1181,6 @@ public class DeviceManagementServiceImpl implements DeviceManagementService {
@QueryParam("version") String version,
@QueryParam("user") String user) {
List deviceIdentifiers = new ArrayList<>();
- Operation operation = new Operation();
try {
RequestValidationUtil.validateDeviceIdentifier(type, id);
Device device = DeviceMgtAPIUtils.getDeviceManagementService().getDevice(id, false);
@@ -1182,11 +1201,12 @@ public class DeviceManagementServiceImpl implements DeviceManagementService {
//if the applications not installed via entgra store
} else {
if (Constants.ANDROID.equals(type)) {
- ApplicationUninstallation applicationUninstallation = new ApplicationUninstallation(packageName, "PUBLIC", name, platform, version, user);
- Gson gson = new Gson();
+ ApplicationUninstallation applicationUninstallation = new ApplicationUninstallation(packageName,
+ MobileAppTypes.PUBLIC.toString(), name, platform, version, user);
+ ProfileOperation operation = new ProfileOperation();
operation.setCode(MDMAppConstants.AndroidConstants.UNMANAGED_APP_UNINSTALL);
operation.setType(Operation.Type.PROFILE);
- operation.setPayLoad(gson.toJson(applicationUninstallation));
+ operation.setPayLoad(applicationUninstallation.toJson());
DeviceManagementProviderService deviceManagementProviderService = HelperUtil
.getDeviceManagementProviderService();
Activity activity = deviceManagementProviderService.addOperation(
diff --git a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/impl/util/RequestValidationUtil.java b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/impl/util/RequestValidationUtil.java
index e3e319272c..be5066a4d9 100644
--- a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/impl/util/RequestValidationUtil.java
+++ b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/impl/util/RequestValidationUtil.java
@@ -23,7 +23,11 @@ import io.entgra.device.mgt.core.device.mgt.api.jaxrs.beans.*;
import io.entgra.device.mgt.core.device.mgt.api.jaxrs.exception.BadRequestException;
import io.entgra.device.mgt.core.device.mgt.api.jaxrs.util.Constants;
import io.entgra.device.mgt.core.device.mgt.api.jaxrs.util.DeviceMgtAPIUtils;
-import io.entgra.device.mgt.core.device.mgt.common.*;
+import io.entgra.device.mgt.core.device.mgt.common.Base64File;
+import io.entgra.device.mgt.core.device.mgt.common.DeviceIdentifier;
+import io.entgra.device.mgt.core.device.mgt.common.Feature;
+import io.entgra.device.mgt.core.device.mgt.common.FeatureManager;
+import io.entgra.device.mgt.core.device.mgt.common.OperationLogFilters;
import io.entgra.device.mgt.core.device.mgt.common.app.mgt.Application;
import io.entgra.device.mgt.core.device.mgt.common.configuration.mgt.PlatformConfiguration;
import io.entgra.device.mgt.core.device.mgt.common.exceptions.DeviceManagementException;
@@ -40,6 +44,8 @@ import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.http.HttpStatus;
+import org.json.JSONArray;
+import org.json.JSONObject;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
@@ -809,6 +815,30 @@ public class RequestValidationUtil {
new ErrorResponse.ErrorResponseBuilder()
.setCode(HttpStatus.SC_BAD_REQUEST).setMessage(msg).build());
}
+ if (metadata.getMetaKey().equals("PER_DEVICE_COST")) {
+ String metaValue = metadata.getMetaValue();
+ JSONArray jsonArray = new JSONArray(metaValue);
+
+ for (int i = 0; i < jsonArray.length(); i++) {
+ JSONObject jsonObject = jsonArray.getJSONObject(i);
+ if (jsonObject.has("cost")) {
+ Object costObj = jsonObject.get("cost");
+ if (costObj == JSONObject.NULL || (costObj instanceof Number && ((Number) costObj).doubleValue() < 0)) {
+ String msg = "Billing cost cannot be a minus value or null.";
+ log.error(msg);
+ throw new InputValidationException(
+ new ErrorResponse.ErrorResponseBuilder()
+ .setCode(HttpStatus.SC_BAD_REQUEST).setMessage(msg).build());
+ }
+ } else {
+ String msg = "Billing cost is missing.";
+ log.error(msg);
+ throw new InputValidationException(
+ new ErrorResponse.ErrorResponseBuilder()
+ .setCode(HttpStatus.SC_BAD_REQUEST).setMessage(msg).build());
+ }
+ }
+ }
if (metadata.getMetaValue() == null) {
String msg = "Request parameter metaValue should be non empty.";
log.error(msg);
diff --git a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.common/pom.xml b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.common/pom.xml
index 512394b706..cc9da3624c 100644
--- a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.common/pom.xml
+++ b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.common/pom.xml
@@ -21,7 +21,7 @@
device-mgt
io.entgra.device.mgt.core
- 5.2.1-SNAPSHOT
+ 5.2.4-SNAPSHOT
../pom.xml
diff --git a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.common/src/main/java/io/entgra/device/mgt/core/device/mgt/common/Device.java b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.common/src/main/java/io/entgra/device/mgt/core/device/mgt/common/Device.java
index e88fb52ae0..592301ff12 100644
--- a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.common/src/main/java/io/entgra/device/mgt/core/device/mgt/common/Device.java
+++ b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.common/src/main/java/io/entgra/device/mgt/core/device/mgt/common/Device.java
@@ -97,6 +97,10 @@ public class Device implements Serializable {
public Device() {
}
+ public Device(int id) {
+ this.id = id;
+ }
+
public Device(String name, String type, String description, String deviceId, EnrolmentInfo enrolmentInfo,
List features, List properties) {
this.name = name;
@@ -268,7 +272,9 @@ public class Device implements Serializable {
Device device = (Device) o;
- return getDeviceIdentifier().equals(device.getDeviceIdentifier());
+ if (getDeviceIdentifier().equals(device.getDeviceIdentifier())) return true;
+
+ return getId() == device.getId();
}
diff --git a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.common/src/main/java/io/entgra/device/mgt/core/device/mgt/common/PaginationRequest.java b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.common/src/main/java/io/entgra/device/mgt/core/device/mgt/common/PaginationRequest.java
index 513a0a0d62..1a494d7f17 100644
--- a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.common/src/main/java/io/entgra/device/mgt/core/device/mgt/common/PaginationRequest.java
+++ b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.common/src/main/java/io/entgra/device/mgt/core/device/mgt/common/PaginationRequest.java
@@ -50,6 +50,7 @@ public class PaginationRequest {
private List statusList = new ArrayList<>();
private OperationLogFilters operationLogFilters = new OperationLogFilters();
private List sortColumn = new ArrayList<>();
+ private int deviceTypeId;
public OperationLogFilters getOperationLogFilters() {
return operationLogFilters;
}
@@ -288,4 +289,12 @@ public class PaginationRequest {
public void setTabActionStatus(String tabActionStatus) {
this.tabActionStatus = tabActionStatus;
}
+
+ public int getDeviceTypeId() {
+ return deviceTypeId;
+ }
+
+ public void setDeviceTypeId(int deviceTypeId) {
+ this.deviceTypeId = deviceTypeId;
+ }
}
diff --git a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.config.api/pom.xml b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.config.api/pom.xml
index b037bf48d9..62e006db4b 100644
--- a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.config.api/pom.xml
+++ b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.config.api/pom.xml
@@ -22,7 +22,7 @@
device-mgt
io.entgra.device.mgt.core
- 5.2.1-SNAPSHOT
+ 5.2.4-SNAPSHOT
../pom.xml
diff --git a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/pom.xml b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/pom.xml
index 8bf838c2fe..00788c96f4 100644
--- a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/pom.xml
+++ b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/pom.xml
@@ -22,7 +22,7 @@
io.entgra.device.mgt.core
device-mgt
- 5.2.1-SNAPSHOT
+ 5.2.4-SNAPSHOT
../pom.xml
diff --git a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/dao/DeviceDAO.java b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/dao/DeviceDAO.java
index 13052f62c1..62aa6b4439 100644
--- a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/dao/DeviceDAO.java
+++ b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/dao/DeviceDAO.java
@@ -18,12 +18,17 @@
package io.entgra.device.mgt.core.device.mgt.core.dao;
-import io.entgra.device.mgt.core.device.mgt.common.*;
+import io.entgra.device.mgt.core.device.mgt.common.Count;
+import io.entgra.device.mgt.core.device.mgt.common.Device;
+import io.entgra.device.mgt.core.device.mgt.common.DeviceIdentifier;
+import io.entgra.device.mgt.core.device.mgt.common.EnrolmentInfo;
import io.entgra.device.mgt.core.device.mgt.common.EnrolmentInfo.Status;
+import io.entgra.device.mgt.core.device.mgt.common.PaginationRequest;
import io.entgra.device.mgt.core.device.mgt.common.configuration.mgt.DevicePropertyInfo;
import io.entgra.device.mgt.core.device.mgt.common.device.details.DeviceData;
import io.entgra.device.mgt.core.device.mgt.common.device.details.DeviceLocationHistorySnapshot;
import io.entgra.device.mgt.core.device.mgt.common.device.details.DeviceMonitoringData;
+import io.entgra.device.mgt.core.device.mgt.common.exceptions.DeviceManagementException;
import io.entgra.device.mgt.core.device.mgt.common.geo.service.GeoCluster;
import io.entgra.device.mgt.core.device.mgt.common.geo.service.GeoQuery;
import io.entgra.device.mgt.core.device.mgt.core.dto.DeviceType;
@@ -864,4 +869,28 @@ public interface DeviceDAO {
* @throws DeviceManagementDAOException
*/
int getCountOfDevicesNotInGroup(PaginationRequest request, int tenantId) throws DeviceManagementDAOException;
+
+ List getDevicesNotInGivenIdList(List deviceIds, int tenantId)
+ throws DeviceManagementDAOException;
+
+ List getDevicesInGivenIdList(List deviceIds, int tenantId)
+ throws DeviceManagementDAOException;
+
+ int getDeviceCountNotInGivenIdList(List deviceIds, int tenantId)
+ throws DeviceManagementDAOException;
+
+ List getDevicesByDeviceIds(PaginationRequest paginationRequest, List deviceIds, int tenantId)
+ throws DeviceManagementDAOException;
+
+ int getDeviceCountByDeviceIds(PaginationRequest paginationRequest, List deviceIds, int tenantId)
+ throws DeviceManagementDAOException;
+
+ /**
+ * This method is used to get device count that are not within a specific group.
+ *
+ * @param statuses Device statuses to be filtered
+ * @return deviceIds
+ * @throws DeviceManagementException
+ */
+ List getDeviceIdsByStatus(List statuses) throws DeviceManagementException;
}
diff --git a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/dao/GroupDAO.java b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/dao/GroupDAO.java
index c5d2d700cd..5da24ad91d 100644
--- a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/dao/GroupDAO.java
+++ b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/dao/GroupDAO.java
@@ -488,4 +488,5 @@ public interface GroupDAO {
int tenantId, String deviceOwner, String deviceName, String deviceStatus, int offset, int limit)
throws GroupManagementDAOException;
+ int getDeviceCount(String groupName, int tenantId) throws GroupManagementDAOException;
}
\ No newline at end of file
diff --git a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/dao/impl/AbstractDeviceDAOImpl.java b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/dao/impl/AbstractDeviceDAOImpl.java
index b9b22d37bc..6ebf7e6a7d 100644
--- a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/dao/impl/AbstractDeviceDAOImpl.java
+++ b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/dao/impl/AbstractDeviceDAOImpl.java
@@ -27,6 +27,7 @@ import io.entgra.device.mgt.core.device.mgt.common.configuration.mgt.DevicePrope
import io.entgra.device.mgt.core.device.mgt.common.device.details.DeviceData;
import io.entgra.device.mgt.core.device.mgt.common.device.details.DeviceLocationHistorySnapshot;
import io.entgra.device.mgt.core.device.mgt.common.device.details.DeviceMonitoringData;
+import io.entgra.device.mgt.core.device.mgt.common.exceptions.DeviceManagementException;
import io.entgra.device.mgt.core.device.mgt.common.geo.service.GeoQuery;
import io.entgra.device.mgt.core.device.mgt.core.dao.DeviceDAO;
import io.entgra.device.mgt.core.device.mgt.core.dao.DeviceManagementDAOException;
@@ -54,6 +55,7 @@ import java.util.List;
import java.util.Map;
import java.util.StringJoiner;
import java.util.Random;
+import java.util.stream.Collectors;
public abstract class AbstractDeviceDAOImpl implements DeviceDAO {
@@ -3298,4 +3300,224 @@ public abstract class AbstractDeviceDAOImpl implements DeviceDAO {
throw new DeviceManagementDAOException(msg, e);
}
}
+
+ @Override
+ public List getDevicesNotInGivenIdList(List deviceIds, int tenantId)
+ throws DeviceManagementDAOException {
+ List filteredDeviceIds = new ArrayList<>();
+ try {
+ Connection connection = getConnection();
+ String sql = "SELECT ID AS DEVICE_ID FROM DM_DEVICE WHERE TENANT_ID = ?";
+
+ if (deviceIds != null && !deviceIds.isEmpty()) {
+ sql += " AND ID NOT IN ( " + deviceIds.stream().map(id -> "?").collect(Collectors.joining(",")) + ")";
+ }
+
+ try (PreparedStatement preparedStatement = connection.prepareStatement(sql)) {
+ int paraIdx = 1;
+ preparedStatement.setInt(paraIdx++, tenantId);
+
+ if (deviceIds != null && !deviceIds.isEmpty()) {
+ for (Integer deviceId : deviceIds) {
+ preparedStatement.setInt(paraIdx++, deviceId);
+ }
+ }
+
+ try (ResultSet resultSet = preparedStatement.executeQuery()) {
+ while (resultSet.next()) {
+ filteredDeviceIds.add(resultSet.getInt("DEVICE_ID"));
+ }
+ }
+ return filteredDeviceIds;
+ }
+ } catch (SQLException e) {
+ String msg = "Error occurred while retrieving device ids not in: " + filteredDeviceIds;
+ log.error(msg, e);
+ throw new DeviceManagementDAOException(msg, e);
+ }
+ }
+
+ @Override
+ public List getDevicesInGivenIdList(List deviceIds, int tenantId)
+ throws DeviceManagementDAOException {
+ List filteredDeviceIds = new ArrayList<>();
+ if (deviceIds == null || deviceIds.isEmpty()) return filteredDeviceIds;
+
+ String deviceIdStringList = deviceIds.stream().map(id -> "?").collect(Collectors.joining(","));
+ try {
+ Connection connection = getConnection();
+ String sql = "SELECT ID AS DEVICE_ID " +
+ "FROM DM_DEVICE " +
+ "WHERE ID IN (" + deviceIdStringList + ") " +
+ "AND TENANT_ID = ? ";
+ try (PreparedStatement preparedStatement = connection.prepareStatement(sql)) {
+ int paraIdx = 1;
+ for (Integer deviceId : deviceIds) {
+ preparedStatement.setInt(paraIdx++, deviceId);
+ }
+
+ preparedStatement.setInt(paraIdx, tenantId);
+ try (ResultSet resultSet = preparedStatement.executeQuery()) {
+ while (resultSet.next()) {
+ filteredDeviceIds.add(resultSet.getInt("DEVICE_ID"));
+ }
+ }
+ return filteredDeviceIds;
+ }
+ } catch (SQLException e) {
+ String msg = "Error occurred while retrieving device ids in: " + filteredDeviceIds;
+ log.error(msg, e);
+ throw new DeviceManagementDAOException(msg, e);
+ }
+ }
+
+ @Override
+ public int getDeviceCountNotInGivenIdList(List deviceIds, int tenantId)
+ throws DeviceManagementDAOException {
+ int deviceCount = 0;
+ try {
+ Connection connection = getConnection();
+ String sql = "SELECT COUNT(ID) AS COUNT " +
+ "FROM DM_DEVICE " +
+ "WHERE TENANT_ID = ?";
+
+ if (deviceIds != null && !deviceIds.isEmpty()) {
+ sql += " AND ID NOT IN ( " + deviceIds.stream().map(id -> "?").collect(Collectors.joining(",")) + ")";
+ }
+
+ try (PreparedStatement preparedStatement = connection.prepareStatement(sql)) {
+ int paraIdx = 1;
+ preparedStatement.setInt(paraIdx++, tenantId);
+
+ if (deviceIds != null && !deviceIds.isEmpty()) {
+ for (Integer deviceId : deviceIds) {
+ preparedStatement.setInt(paraIdx++, deviceId);
+ }
+ }
+
+ try (ResultSet resultSet = preparedStatement.executeQuery()) {
+ if (resultSet.next()) {
+ deviceCount = resultSet.getInt("COUNT");
+ }
+ }
+ return deviceCount;
+ }
+ } catch (SQLException e) {
+ String msg = "Error occurred while retrieving device count";
+ log.error(msg, e);
+ throw new DeviceManagementDAOException(msg, e);
+ }
+ }
+
+ @Override
+ public int getDeviceCountByDeviceIds(PaginationRequest paginationRequest, List deviceIds, int tenantId)
+ throws DeviceManagementDAOException {
+ int deviceCount = 0;
+ if (deviceIds == null || deviceIds.isEmpty()) return deviceCount;
+
+ String deviceIdStringList = deviceIds.stream().map(id -> "?").collect(Collectors.joining(","));
+ boolean isOwnerProvided = false;
+ boolean isDeviceStatusProvided = false;
+ boolean isDeviceNameProvided = false;
+ boolean isDeviceTypeIdProvided = false;
+ try {
+ Connection connection = getConnection();
+ String sql = "SELECT COUNT(DISTINCT e.DEVICE_ID) AS COUNT " +
+ "FROM DM_DEVICE d " +
+ "INNER JOIN DM_ENROLMENT e " +
+ "ON d.ID = e.DEVICE_ID " +
+ "WHERE e.TENANT_ID = ? " +
+ "AND e.DEVICE_ID IN (" + deviceIdStringList+ ") " +
+ "AND e.STATUS NOT IN ('DELETED', 'REMOVED')";
+
+ if (paginationRequest.getOwner() != null) {
+ sql = sql + " AND e.OWNER LIKE ?";
+ isOwnerProvided = true;
+ }
+
+ if (paginationRequest.getDeviceStatus() != null) {
+ sql = sql + " AND e.STATUS = ?";
+ isDeviceStatusProvided = true;
+ }
+
+ if (paginationRequest.getDeviceName() != null) {
+ sql = sql + " AND d.NAME LIKE ?";
+ isDeviceNameProvided = true;
+ }
+
+ if (paginationRequest.getDeviceTypeId() > 0) {
+ sql = sql + " AND d.DEVICE_TYPE_ID = ?";
+ isDeviceTypeIdProvided = true;
+ }
+
+ try (PreparedStatement preparedStatement = connection.prepareStatement(sql)) {
+ int parameterIdx = 1;
+ preparedStatement.setInt(parameterIdx++, tenantId);
+
+ for (Integer deviceId : deviceIds) {
+ preparedStatement.setInt(parameterIdx++, deviceId);
+ }
+
+ if (isOwnerProvided) {
+ preparedStatement.setString(parameterIdx++, "%" + paginationRequest.getOwner() + "%");
+ }
+ if (isDeviceStatusProvided) {
+ preparedStatement.setString(parameterIdx++, paginationRequest.getDeviceStatus());
+ }
+ if (isDeviceNameProvided) {
+ preparedStatement.setString(parameterIdx++, "%" + paginationRequest.getDeviceName() + "%");
+ }
+ if (isDeviceTypeIdProvided) {
+ preparedStatement.setInt(parameterIdx, paginationRequest.getDeviceTypeId());
+ }
+
+ try(ResultSet resultSet = preparedStatement.executeQuery()) {
+ if (resultSet.next()) {
+ deviceCount = resultSet.getInt("COUNT");
+ }
+ }
+ }
+ return deviceCount;
+ } catch (SQLException e) {
+ String msg = "Error occurred while retrieving device count for device ids in: " + deviceIds;
+ log.error(msg, e);
+ throw new DeviceManagementDAOException(msg, e);
+ }
+ }
+
+ @Override
+ public List getDeviceIdsByStatus(List statuses) throws DeviceManagementException {
+ StringBuilder deviceFilters = new StringBuilder();
+ for (int i = 0; i < statuses.size(); i++) {
+ deviceFilters.append("?");
+ if (i < statuses.size() - 1) {
+ deviceFilters.append(",");
+ }
+ }
+
+ try {
+ Connection conn = getConnection();
+ String sql = "SELECT DEVICE_ID " +
+ "FROM DM_ENROLMENT " +
+ "WHERE STATUS IN (" + deviceFilters.toString() + ")";
+
+ try (PreparedStatement ps = conn.prepareStatement(sql)) {
+ for (int i = 0; i < statuses.size(); i++) {
+ ps.setString(i + 1, statuses.get(i));
+ }
+
+ try (ResultSet rs = ps.executeQuery()) {
+ List deviceIds = new ArrayList<>();
+ while (rs.next()) {
+ deviceIds.add(rs.getInt("DEVICE_ID"));
+ }
+ return deviceIds;
+ }
+ }
+ } catch (SQLException e) {
+ String msg = "Error occurred while running SQL to get device IDs by status.";
+ log.error(msg, e);
+ throw new DeviceManagementException(msg, e);
+ }
+ }
}
diff --git a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/dao/impl/AbstractEnrollmentDAOImpl.java b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/dao/impl/AbstractEnrollmentDAOImpl.java
index 608a95c03e..b4415fdf37 100644
--- a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/dao/impl/AbstractEnrollmentDAOImpl.java
+++ b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/dao/impl/AbstractEnrollmentDAOImpl.java
@@ -586,10 +586,13 @@ public abstract class AbstractEnrollmentDAOImpl implements EnrollmentDAO {
"d.NAME AS DEVICE_NAME, " +
"e.DEVICE_TYPE AS DEVICE_TYPE, " +
"e.DEVICE_IDENTIFICATION AS DEVICE_IDENTIFICATION " +
- "FROM DM_ENROLMENT e " +
- "JOIN DM_DEVICE d ON e.DEVICE_ID = d.ID " +
- "WHERE e.OWNER = ? AND e.TENANT_ID = ? AND d.DEVICE_TYPE_ID = ? AND e.STATUS IN (" + deviceFilters + ")");
+ "FROM DM_ENROLMENT e " +
+ "JOIN DM_DEVICE d ON e.DEVICE_ID = d.ID " +
+ "WHERE e.OWNER = ? AND e.TENANT_ID = ? AND e.STATUS IN (" + deviceFilters + ")");
+ if (deviceTypeId != 0) {
+ sql.append(" AND d.DEVICE_TYPE_ID = ?");
+ }
if (deviceOwner != null && !deviceOwner.isEmpty()) {
sql.append(" AND e.OWNER LIKE ?");
}
@@ -606,10 +609,12 @@ public abstract class AbstractEnrollmentDAOImpl implements EnrollmentDAO {
int index = 1;
stmt.setString(index++, owner);
stmt.setInt(index++, tenantId);
- stmt.setInt(index++, deviceTypeId);
for (String status : allowingDeviceStatuses) {
stmt.setString(index++, status);
}
+ if (deviceTypeId != 0) {
+ stmt.setInt(index++, deviceTypeId);
+ }
if (deviceOwner != null && !deviceOwner.isEmpty()) {
stmt.setString(index++, "%" + deviceOwner + "%");
@@ -623,13 +628,6 @@ public abstract class AbstractEnrollmentDAOImpl implements EnrollmentDAO {
try (ResultSet rs = stmt.executeQuery()) {
while (rs.next()) {
- if (ownerDetails.getUserName() == null) {
- ownerDetails.setUserName(rs.getString("OWNER"));
- }
- ownerDetails.setDeviceStatus(rs.getString("DEVICE_STATUS"));
- ownerDetails.setDeviceNames(rs.getString("DEVICE_NAME"));
- ownerDetails.setDeviceTypes(rs.getString("DEVICE_TYPE"));
- ownerDetails.setDeviceIdentifiers(rs.getString("DEVICE_IDENTIFICATION"));
deviceIds.add(rs.getInt("DEVICE_ID"));
deviceCount++;
}
@@ -640,11 +638,95 @@ public abstract class AbstractEnrollmentDAOImpl implements EnrollmentDAO {
log.error(msg, e);
throw new DeviceManagementDAOException(msg, e);
}
+ ownerDetails.setUserName(deviceOwner);
ownerDetails.setDeviceIds(deviceIds);
ownerDetails.setDeviceCount(deviceCount);
return ownerDetails;
}
+// @Override
+// public OwnerWithDeviceDTO getOwnersWithDevices(String owner, List allowingDeviceStatuses, int tenantId,
+// int deviceTypeId, String deviceOwner, String deviceName,
+// String deviceStatus) throws DeviceManagementDAOException {
+// Connection conn = null;
+// OwnerWithDeviceDTO ownerDetails = new OwnerWithDeviceDTO();
+// List deviceIds = new ArrayList<>();
+// int deviceCount = 0;
+//
+// StringBuilder deviceFilters = new StringBuilder();
+// for (int i = 0; i < allowingDeviceStatuses.size(); i++) {
+// deviceFilters.append("?");
+// if (i < allowingDeviceStatuses.size() - 1) {
+// deviceFilters.append(",");
+// }
+// }
+//
+// StringBuilder sql = new StringBuilder(
+// "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 " +
+// "JOIN DM_DEVICE d ON e.DEVICE_ID = d.ID " +
+// "WHERE e.OWNER = ? AND e.TENANT_ID = ? AND d.DEVICE_TYPE_ID = ? AND e.STATUS IN (" + deviceFilters + ")");
+//
+// if (deviceOwner != null && !deviceOwner.isEmpty()) {
+// sql.append(" AND e.OWNER LIKE ?");
+// }
+// if (deviceName != null && !deviceName.isEmpty()) {
+// sql.append(" AND d.NAME LIKE ?");
+// }
+// if (deviceStatus != null && !deviceStatus.isEmpty()) {
+// sql.append(" AND e.STATUS = ?");
+// }
+//
+// try {
+// conn = this.getConnection();
+// try (PreparedStatement stmt = conn.prepareStatement(sql.toString())) {
+// int index = 1;
+// stmt.setString(index++, owner);
+// stmt.setInt(index++, tenantId);
+// stmt.setInt(index++, deviceTypeId);
+// for (String status : allowingDeviceStatuses) {
+// stmt.setString(index++, status);
+// }
+//
+// if (deviceOwner != null && !deviceOwner.isEmpty()) {
+// stmt.setString(index++, "%" + deviceOwner + "%");
+// }
+// if (deviceName != null && !deviceName.isEmpty()) {
+// stmt.setString(index++, "%" + deviceName + "%");
+// }
+// if (deviceStatus != null && !deviceStatus.isEmpty()) {
+// stmt.setString(index++, deviceStatus);
+// }
+//
+// try (ResultSet rs = stmt.executeQuery()) {
+// while (rs.next()) {
+// if (ownerDetails.getUserName() == null) {
+// ownerDetails.setUserName(rs.getString("OWNER"));
+// }
+// ownerDetails.setDeviceStatus(rs.getString("DEVICE_STATUS"));
+// ownerDetails.setDeviceNames(rs.getString("DEVICE_NAME"));
+// ownerDetails.setDeviceTypes(rs.getString("DEVICE_TYPE"));
+// ownerDetails.setDeviceIdentifiers(rs.getString("DEVICE_IDENTIFICATION"));
+// deviceIds.add(rs.getInt("DEVICE_ID"));
+// deviceCount++;
+// }
+// }
+// }
+// } catch (SQLException e) {
+// String msg = "Error occurred while retrieving owners and device IDs for owner: " + owner;
+// log.error(msg, e);
+// throw new DeviceManagementDAOException(msg, e);
+// }
+// ownerDetails.setDeviceIds(deviceIds);
+// ownerDetails.setDeviceCount(deviceCount);
+// return ownerDetails;
+// }
+
@Override
public OwnerWithDeviceDTO getOwnerWithDeviceByDeviceId(int deviceId, int tenantId, String deviceOwner, String deviceName,
String deviceStatus) throws DeviceManagementDAOException {
@@ -730,8 +812,11 @@ public abstract class AbstractEnrollmentDAOImpl implements EnrollmentDAO {
StringBuilder sql = new StringBuilder("SELECT e.DEVICE_ID, e.OWNER, e.STATUS, e.DEVICE_TYPE, e.DEVICE_IDENTIFICATION " +
"FROM DM_ENROLMENT e " +
"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 = ?");
+ "WHERE e.TENANT_ID = ? AND e.STATUS IN (" + deviceFilters.toString() + ")");
+ if (deviceTypeId != 0) {
+ sql.append(" AND d.DEVICE_TYPE_ID = ?");
+ }
if (deviceOwner != null && !deviceOwner.isEmpty()) {
sql.append(" AND e.OWNER LIKE ?");
}
@@ -749,7 +834,9 @@ public abstract class AbstractEnrollmentDAOImpl implements EnrollmentDAO {
for (String status : allowingDeviceStatuses) {
stmt.setString(index++, status);
}
- stmt.setInt(index++, deviceTypeId);
+ if (deviceTypeId != 0) {
+ stmt.setInt(index++, deviceTypeId);
+ }
if (deviceOwner != null && !deviceOwner.isEmpty()) {
stmt.setString(index++, "%" + deviceOwner + "%");
diff --git a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/dao/impl/AbstractGroupDAOImpl.java b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/dao/impl/AbstractGroupDAOImpl.java
index ab4b888bb1..21f831e712 100644
--- a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/dao/impl/AbstractGroupDAOImpl.java
+++ b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/dao/impl/AbstractGroupDAOImpl.java
@@ -1482,9 +1482,11 @@ public abstract class AbstractGroupDAOImpl implements GroupDAO {
"WHERE " +
" g.GROUP_NAME = ? " +
" AND g.TENANT_ID = ? " +
- " AND d.DEVICE_TYPE_ID = ? " +
" AND e.STATUS IN (" + statusPlaceholders + ")");
+ if (deviceTypeId != 0) {
+ sql.append(" AND d.DEVICE_TYPE_ID = ?");
+ }
if (deviceOwner != null && !deviceOwner.isEmpty()) {
sql.append(" AND e.OWNER LIKE ?");
}
@@ -1494,8 +1496,9 @@ public abstract class AbstractGroupDAOImpl implements GroupDAO {
if (deviceStatus != null && !deviceStatus.isEmpty()) {
sql.append(" AND e.STATUS = ?");
}
-
- sql.append(" LIMIT ? OFFSET ?");
+ if (limit >= 0 && offset >=0 ) {
+ sql.append(" LIMIT ? OFFSET ?");
+ }
Connection conn = null;
try {
@@ -1504,11 +1507,12 @@ public abstract class AbstractGroupDAOImpl implements GroupDAO {
int index = 1;
stmt.setString(index++, groupName);
stmt.setInt(index++, tenantId);
- stmt.setInt(index++, deviceTypeId);
for (String status : allowedStatuses) {
stmt.setString(index++, status);
}
-
+ if (deviceTypeId != 0) {
+ stmt.setInt(index++, deviceTypeId);
+ }
if (deviceOwner != null && !deviceOwner.isEmpty()) {
stmt.setString(index++, "%" + deviceOwner + "%");
}
@@ -1519,8 +1523,10 @@ public abstract class AbstractGroupDAOImpl implements GroupDAO {
stmt.setString(index++, deviceStatus);
}
- stmt.setInt(index++, limit);
- stmt.setInt(index++, offset);
+ if (limit >= 0 && offset >=0 ) {
+ stmt.setInt(index++, limit);
+ stmt.setInt(index++, offset);
+ }
try (ResultSet rs = stmt.executeQuery()) {
while (rs.next()) {
@@ -1553,4 +1559,29 @@ public abstract class AbstractGroupDAOImpl implements GroupDAO {
throw new GroupManagementDAOException(msg, e);
}
}
+
+ @Override
+ public int getDeviceCount(String groupName, int tenantId) throws GroupManagementDAOException {
+ int deviceCount = 0;
+ try {
+ Connection connection = GroupManagementDAOFactory.getConnection();
+ String sql = "SELECT COUNT(d.ID) AS COUNT FROM DM_GROUP d INNER JOIN " +
+ "DM_DEVICE_GROUP_MAP m ON " +
+ "d.ID = m.GROUP_ID WHERE d.TENANT_ID = ? AND d.GROUP_NAME = ?";
+ try (PreparedStatement preparedStatement = connection.prepareStatement(sql)) {
+ preparedStatement.setInt(1, tenantId);
+ preparedStatement.setString(2, groupName);
+ try (ResultSet resultSet = preparedStatement.executeQuery()) {
+ if (resultSet.next()) {
+ deviceCount = resultSet.getInt("COUNT");
+ }
+ }
+ }
+ return deviceCount;
+ } catch (SQLException e) {
+ String msg = "Error occurred while retrieving device count for the group: " + groupName;
+ log.error(msg, e);
+ throw new GroupManagementDAOException(msg, e);
+ }
+ }
}
diff --git a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/dao/impl/device/GenericDeviceDAOImpl.java b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/dao/impl/device/GenericDeviceDAOImpl.java
index 63078f50c0..30b1664e46 100644
--- a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/dao/impl/device/GenericDeviceDAOImpl.java
+++ b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/dao/impl/device/GenericDeviceDAOImpl.java
@@ -42,6 +42,7 @@ import java.util.Date;
import java.util.List;
import java.util.StringJoiner;
import java.util.Map;
+import java.util.stream.Collectors;
/**
* This class holds the generic implementation of DeviceDAO which can be used to support ANSI db syntax.
@@ -457,6 +458,7 @@ public class GenericDeviceDAOImpl extends AbstractDeviceDAOImpl {
"e.ID AS ENROLMENT_ID " +
"FROM DM_ENROLMENT e, " +
"(SELECT d.ID, " +
+ "d.LAST_UPDATED_TIMESTAMP, " +
"d.DEVICE_IDENTIFICATION " +
"FROM DM_DEVICE d WHERE d.TENANT_ID = ?) d1 " +
"WHERE d1.ID = e.DEVICE_ID AND e.TENANT_ID = ? ";
@@ -1857,4 +1859,104 @@ public class GenericDeviceDAOImpl extends AbstractDeviceDAOImpl {
}
}
+ @Override
+ public List getDevicesByDeviceIds(PaginationRequest paginationRequest, List deviceIds, int tenantId)
+ throws DeviceManagementDAOException {
+ List devices = new ArrayList<>();
+ if (deviceIds == null || deviceIds.isEmpty()) return devices;
+
+ String deviceIdStringList = deviceIds.stream().map(id -> "?").collect(Collectors.joining(","));
+ boolean isOwnerProvided = false;
+ boolean isDeviceStatusProvided = false;
+ boolean isDeviceNameProvided = false;
+ boolean isDeviceTypeIdProvided = false;
+
+ try {
+ Connection connection = getConnection();
+ String sql = "SELECT e.DEVICE_ID, " +
+ "d.DEVICE_IDENTIFICATION, " +
+ "e.STATUS, " +
+ "e.OWNER, " +
+ "d.NAME AS DEVICE_NAME, " +
+ "e.DEVICE_TYPE, " +
+ "e.OWNERSHIP, " +
+ "e.DATE_OF_LAST_UPDATE " +
+ "FROM DM_DEVICE d " +
+ "INNER JOIN DM_ENROLMENT e " +
+ "ON d.ID = e.DEVICE_ID " +
+ "WHERE d.TENANT_ID = ? " +
+ "AND e.DEVICE_ID IN (" + deviceIdStringList+ ") " +
+ "AND e.STATUS NOT IN ('DELETED', 'REMOVED')";
+
+ if (paginationRequest.getOwner() != null) {
+ sql = sql + " AND e.OWNER LIKE ?";
+ isOwnerProvided = true;
+ }
+
+ if (paginationRequest.getDeviceStatus() != null) {
+ sql = sql + " AND e.STATUS = ?";
+ isDeviceStatusProvided = true;
+ }
+
+ if (paginationRequest.getDeviceName() != null) {
+ sql = sql + " AND d.NAME LIKE ?";
+ isDeviceNameProvided = true;
+ }
+
+ if (paginationRequest.getDeviceTypeId() > 0) {
+ sql = sql + " AND d.DEVICE_TYPE_ID = ?";
+ isDeviceTypeIdProvided = true;
+ }
+
+ sql = sql + " LIMIT ? OFFSET ?";
+
+ try (PreparedStatement preparedStatement = connection.prepareStatement(sql)) {
+ int parameterIdx = 1;
+ preparedStatement.setInt(parameterIdx++, tenantId);
+
+ for (Integer deviceId : deviceIds) {
+ preparedStatement.setInt(parameterIdx++, deviceId);
+ }
+
+ if (isOwnerProvided) {
+ preparedStatement.setString(parameterIdx++, "%" + paginationRequest.getOwner() + "%");
+ }
+ if (isDeviceStatusProvided) {
+ preparedStatement.setString(parameterIdx++, paginationRequest.getDeviceStatus());
+ }
+ if (isDeviceNameProvided) {
+ preparedStatement.setString(parameterIdx++, "%" + paginationRequest.getDeviceName() + "%");
+ }
+ if (isDeviceTypeIdProvided) {
+ preparedStatement.setInt(parameterIdx++, paginationRequest.getDeviceTypeId());
+ }
+
+ preparedStatement.setInt(parameterIdx++, paginationRequest.getRowCount());
+ preparedStatement.setInt(parameterIdx, paginationRequest.getStartIndex());
+
+ try(ResultSet resultSet = preparedStatement.executeQuery()) {
+ Device device;
+ while(resultSet.next()) {
+ device = new Device();
+ device.setId(resultSet.getInt("DEVICE_ID"));
+ device.setDeviceIdentifier(resultSet.getString("DEVICE_IDENTIFICATION"));
+ device.setName(resultSet.getString("DEVICE_NAME"));
+ device.setType(resultSet.getString("DEVICE_TYPE"));
+ EnrolmentInfo enrolmentInfo = new EnrolmentInfo();
+ enrolmentInfo.setStatus(EnrolmentInfo.Status.valueOf(resultSet.getString("STATUS")));
+ enrolmentInfo.setOwner(resultSet.getString("OWNER"));
+ enrolmentInfo.setOwnership(EnrolmentInfo.OwnerShip.valueOf(resultSet.getString("OWNERSHIP")));
+ enrolmentInfo.setDateOfLastUpdate(resultSet.getTimestamp("DATE_OF_LAST_UPDATE").getTime());
+ device.setEnrolmentInfo(enrolmentInfo);
+ devices.add(device);
+ }
+ }
+ }
+ return devices;
+ } catch (SQLException e) {
+ String msg = "Error occurred while retrieving devices for device ids in: " + deviceIds;
+ log.error(msg, e);
+ throw new DeviceManagementDAOException(msg, e);
+ }
+ }
}
diff --git a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/dao/impl/device/OracleDeviceDAOImpl.java b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/dao/impl/device/OracleDeviceDAOImpl.java
index 3effd783c1..e9143faae3 100644
--- a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/dao/impl/device/OracleDeviceDAOImpl.java
+++ b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/dao/impl/device/OracleDeviceDAOImpl.java
@@ -20,6 +20,7 @@ package io.entgra.device.mgt.core.device.mgt.core.dao.impl.device;
import io.entgra.device.mgt.core.device.mgt.common.Device;
import io.entgra.device.mgt.core.device.mgt.common.EnrolmentInfo;
+import io.entgra.device.mgt.core.device.mgt.common.PaginationRequest;
import io.entgra.device.mgt.core.device.mgt.core.dao.DeviceManagementDAOException;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@@ -28,7 +29,9 @@ import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
+import java.util.ArrayList;
import java.util.List;
+import java.util.stream.Collectors;
/**
* This class holds the generic implementation of DeviceDAO which can be used to support ANSI db syntax.
@@ -69,4 +72,94 @@ public class OracleDeviceDAOImpl extends SQLServerDeviceDAOImpl {
}
}
+ @Override
+ public List getDevicesByDeviceIds(PaginationRequest paginationRequest, List deviceIds, int tenantId)
+ throws DeviceManagementDAOException {
+ List devices = new ArrayList<>();
+ if (deviceIds == null || deviceIds.isEmpty()) return devices;
+
+ String deviceIdStringList = deviceIds.stream().map(id -> "?").collect(Collectors.joining(","));
+ boolean isOwnerProvided = false;
+ boolean isDeviceStatusProvided = false;
+ boolean isDeviceNameProvided = false;
+ boolean isDeviceTypeIdProvided = false;
+ try {
+ Connection connection = getConnection();
+ String sql = "SELECT e.DEVICE_ID, " +
+ "d.DEVICE_IDENTIFICATION, " +
+ "e.STATUS, " +
+ "e.OWNER, " +
+ "d.NAME AS DEVICE_NAME, " +
+ "e.DEVICE_TYPE, " +
+ "e.OWNERSHIP, " +
+ "e.DATE_OF_LAST_UPDATE " +
+ "FROM DM_DEVICE d " +
+ "INNER JOIN DM_ENROLMENT e " +
+ "ON d.ID = e.DEVICE_ID " +
+ "WHERE d.TENANT_ID = ? " +
+ "AND e.DEVICE_ID IN (" + deviceIdStringList + ") " +
+ "AND e.STATUS NOT IN ('DELETED', 'REMOVED')";
+ if (paginationRequest.getOwner() != null) {
+ sql += " AND e.OWNER LIKE ?";
+ isOwnerProvided = true;
+ }
+ if (paginationRequest.getDeviceStatus() != null) {
+ sql += " AND e.STATUS = ?";
+ isDeviceStatusProvided = true;
+ }
+ if (paginationRequest.getDeviceName() != null) {
+ sql += " AND d.NAME LIKE ?";
+ isDeviceNameProvided = true;
+ }
+ if (paginationRequest.getDeviceTypeId() > 0) {
+ sql += " AND d.DEVICE_TYPE_ID = ?";
+ isDeviceTypeIdProvided = true;
+ }
+
+ sql += " OFFSET ? ROWS FETCH NEXT ? ROWS ONLY";
+ try (PreparedStatement preparedStatement = connection.prepareStatement(sql)) {
+ int parameterIdx = 1;
+ preparedStatement.setInt(parameterIdx++, tenantId);
+ for (Integer deviceId : deviceIds) {
+ preparedStatement.setInt(parameterIdx++, deviceId);
+ }
+ if (isOwnerProvided) {
+ preparedStatement.setString(parameterIdx++, "%" + paginationRequest.getOwner() + "%");
+ }
+ if (isDeviceStatusProvided) {
+ preparedStatement.setString(parameterIdx++, paginationRequest.getDeviceStatus());
+ }
+ if (isDeviceNameProvided) {
+ preparedStatement.setString(parameterIdx++, "%" + paginationRequest.getDeviceName() + "%");
+ }
+ if (isDeviceTypeIdProvided) {
+ preparedStatement.setInt(parameterIdx++, paginationRequest.getDeviceTypeId());
+ }
+
+ preparedStatement.setInt(parameterIdx++, paginationRequest.getStartIndex());
+ preparedStatement.setInt(parameterIdx, paginationRequest.getRowCount());
+ try (ResultSet resultSet = preparedStatement.executeQuery()) {
+ while (resultSet.next()) {
+ Device device = new Device();
+ device.setId(resultSet.getInt("DEVICE_ID"));
+ device.setDeviceIdentifier(resultSet.getString("DEVICE_IDENTIFICATION"));
+ device.setName(resultSet.getString("DEVICE_NAME"));
+ device.setType(resultSet.getString("DEVICE_TYPE"));
+ EnrolmentInfo enrolmentInfo = new EnrolmentInfo();
+ enrolmentInfo.setStatus(EnrolmentInfo.Status.valueOf(resultSet.getString("STATUS")));
+ enrolmentInfo.setOwner(resultSet.getString("OWNER"));
+ enrolmentInfo.setOwnership(EnrolmentInfo.OwnerShip.valueOf(resultSet.getString("OWNERSHIP")));
+ enrolmentInfo.setDateOfLastUpdate(resultSet.getTimestamp("DATE_OF_LAST_UPDATE").getTime());
+ device.setEnrolmentInfo(enrolmentInfo);
+ devices.add(device);
+ }
+ }
+ }
+ return devices;
+ } catch (SQLException e) {
+ String msg = "Error occurred while retrieving devices for device ids in: " + deviceIds;
+ log.error(msg, e);
+ throw new DeviceManagementDAOException(msg, e);
+ }
+ }
}
diff --git a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/geo/service/GeoLocationProviderServiceImpl.java b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/geo/service/GeoLocationProviderServiceImpl.java
index add64ebac9..7cc550730e 100644
--- a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/geo/service/GeoLocationProviderServiceImpl.java
+++ b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/geo/service/GeoLocationProviderServiceImpl.java
@@ -1512,7 +1512,11 @@ public class GeoLocationProviderServiceImpl implements GeoLocationProviderServic
@Override
public boolean updateGeofence(GeofenceData geofenceData, int fenceId)
throws GeoLocationBasedServiceException, EventConfigurationException {
+ EventConfigurationProviderService eventConfigService;
+ eventConfigService = DeviceManagementDataHolder.getInstance().getEventConfigurationService();
int tenantId;
+ List groupIdsToDelete = new ArrayList<>();
+ List groupIdsToAdd = new ArrayList<>();
try {
tenantId = DeviceManagementDAOUtil.getTenantId();
} catch (DeviceManagementDAOException e) {
@@ -1527,8 +1531,6 @@ public class GeoLocationProviderServiceImpl implements GeoLocationProviderServic
int updatedRowCount = geofenceDAO.updateGeofence(geofenceData, fenceId);
savedGroupIds = geofenceDAO.getGroupIdsOfGeoFence(fenceId);
geofenceData.setId(fenceId);
- List groupIdsToDelete = new ArrayList<>();
- List groupIdsToAdd = new ArrayList<>();
for (Integer savedGroupId : savedGroupIds) {
if (!geofenceData.getGroupIds().contains(savedGroupId)) {
groupIdsToDelete.add(savedGroupId);
@@ -1542,6 +1544,18 @@ public class GeoLocationProviderServiceImpl implements GeoLocationProviderServic
geofenceDAO.deleteGeofenceGroupMapping(groupIdsToDelete, fenceId);
geofenceDAO.createGeofenceGroupMapping(geofenceData, groupIdsToAdd);
EventManagementDAOFactory.commitTransaction();
+ try {
+ if (!groupIdsToDelete.isEmpty()) {
+ eventConfigService.createEventOperationTask(OperationMgtConstants.OperationCodes.EVENT_REVOKE,
+ DeviceManagementConstants.EventServices.GEOFENCE,
+ new GeoFenceEventMeta(geofenceData), tenantId, groupIdsToDelete);
+ }
+ } catch (EventConfigurationException e) {
+ String msg = "Failed while creating EVENT_REVOKE operation creation task entry while updating geo fence "
+ + geofenceData.getFenceName() + " of the tenant " + tenantId;
+ log.error(msg, e);
+ throw new GeoLocationBasedServiceException(msg, e);
+ }
if (updatedRowCount > 0) {
GeoCacheManagerImpl.getInstance().updateGeoFenceInCache(geofenceData, fenceId, tenantId);
}
diff --git a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/service/DeviceManagementProviderService.java b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/service/DeviceManagementProviderService.java
index 36595941d1..53e8aa5796 100644
--- a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/service/DeviceManagementProviderService.java
+++ b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/service/DeviceManagementProviderService.java
@@ -50,7 +50,6 @@ import org.apache.commons.collections.map.SingletonMap;
import java.sql.SQLException;
import java.sql.Timestamp;
-import java.util.Collection;
import java.util.Date;
import java.util.List;
import java.util.Map;
@@ -1144,4 +1143,24 @@ public interface DeviceManagementProviderService {
*/
Device updateDeviceName(Device device, String deviceType, String deviceId)
throws DeviceManagementException, DeviceNotFoundException, ConflictException;
+
+ List getDevicesNotInGivenIdList(List deviceIds)
+ throws DeviceManagementException;
+
+ List getDevicesInGivenIdList(List deviceIds)
+ throws DeviceManagementException;
+ int getDeviceCountNotInGivenIdList(List deviceIds) throws DeviceManagementException;
+
+ List getDevicesByDeviceIds(PaginationRequest paginationRequest, List