From e487ef46272074bb63ba5ad622b6f296d2276d24 Mon Sep 17 00:00:00 2001 From: Ace Date: Wed, 10 Oct 2018 18:37:37 +0530 Subject: [PATCH 1/2] Fixing issue due to changes in serialVersionUID after adding an additional field to Operation DTO. As a fix, serializationUID of the earlier revision of the class was included in the current code --- .../carbon/device/mgt/core/dto/operation/mgt/Operation.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/dto/operation/mgt/Operation.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/dto/operation/mgt/Operation.java index 1b34b5d02b..07c2674f0f 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/dto/operation/mgt/Operation.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/dto/operation/mgt/Operation.java @@ -23,6 +23,8 @@ import java.util.Properties; public class Operation implements Serializable { + private static final long serialVersionUID = -353614864628915060L; + public enum Type { CONFIG, MESSAGE, INFO, COMMAND, PROFILE , POLICY } From de0bc0bb50b9335d63b76eeafd5366ba596f1e35 Mon Sep 17 00:00:00 2001 From: Ace Date: Fri, 12 Oct 2018 10:44:53 +0530 Subject: [PATCH 2/2] persisting profile operation payloads as string values as upposed to profile objects. this will iron iot future compatibility issues that may arise, due to operation dto getting updated --- .../mgt/dao/impl/ProfileOperationDAOImpl.java | 49 ++++++++++++++----- .../operation/OperationManagementTests.java | 15 +++--- 2 files changed, 46 insertions(+), 18 deletions(-) diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/operation/mgt/dao/impl/ProfileOperationDAOImpl.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/operation/mgt/dao/impl/ProfileOperationDAOImpl.java index 9223b3c030..769537b47b 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/operation/mgt/dao/impl/ProfileOperationDAOImpl.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/operation/mgt/dao/impl/ProfileOperationDAOImpl.java @@ -53,7 +53,7 @@ public class ProfileOperationDAOImpl extends GenericOperationDAOImpl { bao = new ByteArrayOutputStream(); oos = new ObjectOutputStream(bao); - oos.writeObject(operation); + oos.writeObject(operation.getPayLoad()); stmt.setInt(1, operationId); stmt.setBytes(2, bao.toByteArray()); @@ -91,7 +91,8 @@ public class ProfileOperationDAOImpl extends GenericOperationDAOImpl { ObjectInputStream ois; try { Connection conn = OperationManagementDAOFactory.getConnection(); - String sql = "SELECT OPERATION_ID, ENABLED, OPERATION_DETAILS FROM DM_PROFILE_OPERATION WHERE OPERATION_ID=?"; + String sql = "SELECT o.ID, po.ENABLED, po.OPERATION_DETAILS, o.CREATED_TIMESTAMP, o.OPERATION_CODE " + + "FROM DM_PROFILE_OPERATION po INNER JOIN DM_OPERATION o ON po.OPERATION_ID = O.ID WHERE po.OPERATION_ID=?"; stmt = conn.prepareStatement(sql); stmt.setInt(1, id); @@ -99,9 +100,20 @@ public class ProfileOperationDAOImpl extends GenericOperationDAOImpl { if (rs.next()) { byte[] operationDetails = rs.getBytes("OPERATION_DETAILS"); + int oppId = rs.getInt("ID"); bais = new ByteArrayInputStream(operationDetails); ois = new ObjectInputStream(bais); - profileOperation = (ProfileOperation) ois.readObject(); + Object obj = ois.readObject(); + if(obj instanceof String){ + profileOperation = new ProfileOperation(); + profileOperation.setCode(rs.getString("OPERATION_CODE")); + profileOperation.setId(oppId); + profileOperation.setCreatedTimeStamp(rs.getString("CREATED_TIMESTAMP")); + profileOperation.setId(oppId); + profileOperation.setPayLoad(obj); + } else { + profileOperation = (ProfileOperation) obj; + } } } catch (IOException e) { throw new OperationManagementDAOException("IO Error occurred while de serialize the profile " + @@ -110,7 +122,7 @@ public class ProfileOperationDAOImpl extends GenericOperationDAOImpl { throw new OperationManagementDAOException("Class not found error occurred while de serialize the " + "profile operation object", e); } catch (SQLException e) { - throw new OperationManagementDAOException("SQL Error occurred while retrieving the command " + + throw new OperationManagementDAOException("SQL Error occurred while retrieving the profile " + "operation object " + "available for the id '" + id, e); } finally { OperationManagementDAOUtil.cleanupResources(stmt, rs); @@ -120,7 +132,7 @@ public class ProfileOperationDAOImpl extends GenericOperationDAOImpl { @Override public List getOperationsByDeviceAndStatus(int enrolmentId, - Operation.Status status) throws OperationManagementDAOException { + Operation.Status status) throws OperationManagementDAOException { PreparedStatement stmt = null; ResultSet rs = null; ProfileOperation profileOperation; @@ -132,10 +144,12 @@ public class ProfileOperationDAOImpl extends GenericOperationDAOImpl { try { Connection conn = OperationManagementDAOFactory.getConnection(); - String sql = "Select po.OPERATION_ID, ENABLED, OPERATION_DETAILS from DM_PROFILE_OPERATION po " + - "INNER JOIN " + - "(Select * From DM_ENROLMENT_OP_MAPPING WHERE ENROLMENT_ID=? " + - "AND STATUS=?) dm ON dm.OPERATION_ID = po.OPERATION_ID"; + String sql = "SELECT o.ID, po1.ENABLED, po1.STATUS, o.TYPE, o.CREATED_TIMESTAMP, o.RECEIVED_TIMESTAMP, " + + "o.OPERATION_CODE, po1.OPERATION_DETAILS " + + "FROM (SELECT po.OPERATION_ID, po.ENABLED, po.OPERATION_DETAILS, dm.STATUS " + + "FROM DM_PROFILE_OPERATION po INNER JOIN (SELECT ENROLMENT_ID, OPERATION_ID, STATUS FROM DM_ENROLMENT_OP_MAPPING " + + "WHERE ENROLMENT_ID = ? AND STATUS = ?) dm ON dm.OPERATION_ID = po.OPERATION_ID) po1 " + + "INNER JOIN DM_OPERATION o ON po1.OPERATION_ID = o.ID "; stmt = conn.prepareStatement(sql); stmt.setInt(1, enrolmentId); @@ -147,9 +161,20 @@ public class ProfileOperationDAOImpl extends GenericOperationDAOImpl { byte[] operationDetails = rs.getBytes("OPERATION_DETAILS"); bais = new ByteArrayInputStream(operationDetails); ois = new ObjectInputStream(bais); - profileOperation = (ProfileOperation) ois.readObject(); - profileOperation.setStatus(status); - operationList.add(profileOperation); + Object obj = ois.readObject(); + if(obj instanceof String){ + profileOperation = new ProfileOperation(); + profileOperation.setCode(rs.getString("OPERATION_CODE")); + profileOperation.setId(rs.getInt("ID")); + profileOperation.setCreatedTimeStamp(rs.getString("CREATED_TIMESTAMP")); + profileOperation.setPayLoad(obj); + profileOperation.setStatus(status); + operationList.add(profileOperation); + } else { + profileOperation = (ProfileOperation) obj; + profileOperation.setStatus(status); + operationList.add(profileOperation); + } } } catch (IOException e) { diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/test/java/org/wso2/carbon/device/mgt/core/operation/OperationManagementTests.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/test/java/org/wso2/carbon/device/mgt/core/operation/OperationManagementTests.java index dcfd63b995..bb5657d8fb 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/test/java/org/wso2/carbon/device/mgt/core/operation/OperationManagementTests.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/test/java/org/wso2/carbon/device/mgt/core/operation/OperationManagementTests.java @@ -67,6 +67,7 @@ public class OperationManagementTests extends BaseDeviceManagementTest { private static final String POLICY_OPERATION_CODE = "POLICY-TEST"; private static final String CONFIG_OPERATION_CODE = "CONFIG-TEST"; private static final String PROFILE_OPERATION_CODE = "PROFILE-TEST"; + private static final String PROFILE_NOTIFICATION_CODE = "NOTIFICATION"; private static final String DATE_FORMAT_NOW = "yyyy-MM-dd HH:mm:ss"; private static final int NO_OF_DEVICES = 5; private static final String ADMIN_USER = "admin"; @@ -101,14 +102,14 @@ public class OperationManagementTests extends BaseDeviceManagementTest { } this.deviceMgmtProvider = DeviceManagementDataHolder.getInstance().getDeviceManagementProvider(); deviceManagementService = new TestDeviceManagementService(DEVICE_TYPE, - MultitenantConstants.SUPER_TENANT_DOMAIN_NAME); + MultitenantConstants.SUPER_TENANT_DOMAIN_NAME); this.operationMgtService = PowerMockito.spy(new OperationManagerImpl(DEVICE_TYPE, deviceManagementService)); PowerMockito.when(this.operationMgtService, "getNotificationStrategy").thenReturn(new TestNotificationStrategy()); } @Test public void addCommandOperation() throws DeviceManagementException, OperationManagementException, - InvalidDeviceException { + InvalidDeviceException { OperationManager operationManager = PowerMockito.spy( new OperationManagerImpl(DEVICE_TYPE, deviceManagementService)); try { @@ -154,7 +155,7 @@ public class OperationManagementTests extends BaseDeviceManagementTest { public void addEmptyDevicesCommandOperation() throws DeviceManagementException, OperationManagementException, InvalidDeviceException { this.operationMgtService.addOperation(getOperation(new CommandOperation(), Operation.Type.COMMAND, - COMMAND_OPERATION_CODE), new ArrayList<>()); + COMMAND_OPERATION_CODE), new ArrayList<>()); } @Test(expectedExceptions = InvalidDeviceException.class) @@ -205,8 +206,10 @@ public class OperationManagementTests extends BaseDeviceManagementTest { @Test(dependsOnMethods = "addConfigOperation") public void addProfileOperation() throws DeviceManagementException, OperationManagementException, InvalidDeviceException { - Activity activity = this.operationMgtService.addOperation(getOperation(new ProfileOperation(), - Operation.Type.PROFILE, PROFILE_OPERATION_CODE), + Operation opp = getOperation(new ProfileOperation(), + Operation.Type.PROFILE, PROFILE_NOTIFICATION_CODE); + opp.setPayLoad("{\"messageText\":\"xyz\",\"messageTitle\":\"abc\"}"); + Activity activity = this.operationMgtService.addOperation(opp , this.deviceIds); validateOperationResponse(activity, ActivityStatus.Status.PENDING); } @@ -531,7 +534,7 @@ public class OperationManagementTests extends BaseDeviceManagementTest { expectedExceptions = OperationManagementException.class) public void getUpdateOperationForInvalidDevice() throws DeviceManagementException, OperationManagementException { this.operationMgtService.updateOperation(new DeviceIdentifier(INVALID_DEVICE, DEVICE_TYPE), - getOperation(new CommandOperation(), Operation.Type.COMMAND, COMMAND_OPERATION_CODE)); + getOperation(new CommandOperation(), Operation.Type.COMMAND, COMMAND_OPERATION_CODE)); } @Test(dependsOnMethods = "getUpdateOperationForInvalidDevice",