From 9fb3a4dec71897ea2831415e7a83dcfe6bd6abf9 Mon Sep 17 00:00:00 2001 From: Isuri Medis Date: Wed, 31 Jan 2024 05:07:46 +0000 Subject: [PATCH] deviceOrg (#326) Device Organization Complete Back End Co-authored-by: isuri Reviewed-on: https://repository.entgra.net/community/device-mgt-core/pulls/326 Co-authored-by: Isuri Medis Co-committed-by: Isuri Medis --- .../extension/api/util/APIUtil.java | 3 + .../pom.xml | 344 +++++ .../organization/api/ApiOriginFilter.java | 48 + .../api/DeviceOrganizationMgtService.java | 793 +++++++++++ .../api/DeviceOrganizationMgtServiceImpl.java | 268 ++++ .../organization/api/beans/ErrorListItem.java | 78 ++ .../organization/api/beans/ErrorResponse.java | 193 +++ .../api/beans/GsonMessageBodyHandler.java | 97 ++ .../api/beans/SuccessResponse.java | 32 + .../api/beans/ValidationInterceptor.java | 124 ++ .../api/util/DeviceOrgAPIUtils.java | 58 + .../api/util/DeviceOrgConstants.java | 6 + .../api/util/InputValidationException.java | 34 + .../api/util/RequestValidationUtil.java | 46 + .../webapp/META-INF/webapp-classloading.xml | 35 + .../src/main/webapp/WEB-INF/cxf-servlet.xml | 66 + .../src/main/webapp/WEB-INF/web.xml | 119 ++ .../pom.xml | 416 ++++++ .../dao/DeviceOrganizationDAO.java | 209 +++ .../dao/DeviceOrganizationDAOFactory.java | 85 ++ .../dao/impl/DeviceOrganizationDAOImpl.java | 986 +++++++++++++ .../impl/DeviceOrganizationMysqlDAOImpl.java | 938 +++++++++++++ .../dao/util/ConnectionManagerUtil.java | 288 ++++ .../dao/util/DeviceOrganizationDaoUtil.java | 100 ++ .../organization/dto/AdditionResult.java | 23 + .../device/organization/dto/DeviceNode.java | 68 + .../organization/dto/DeviceNodeResult.java | 42 + .../organization/dto/DeviceOrganization.java | 123 ++ .../organization/dto/PaginationRequest.java | 64 + .../exception/BadRequestDaoException.java | 36 + .../exception/BadRequestException.java | 36 + .../exception/DBConnectionException.java | 47 + .../DeviceOrganizationMgtDAOException.java | 97 ++ .../DeviceOrganizationMgtPluginException.java | 98 ++ .../UnsupportedDatabaseEngineException.java | 40 + .../impl/DeviceOrganizationServiceImpl.java | 637 +++++++++ .../DeviceOrganizationMgtDataHolder.java | 66 + ...DeviceOrganizationMgtServiceComponent.java | 147 ++ .../spi/DeviceOrganizationService.java | 190 +++ .../device/organization/DAONegativeTest.java | 40 + .../device/organization/DAOTest.java | 169 +++ .../device/organization/DataSourceConfig.java | 78 ++ .../organization/ServiceNegativeTest.java | 198 +++ .../device/organization/ServiceTest.java | 489 +++++++ .../device/organization/TestUtils.java | 53 + .../mock/BaseDeviceOrganizationTest.java | 161 +++ .../organization/mock/MockConnection.java | 343 +++++ .../organization/mock/MockDataSource.java | 123 ++ .../mock/MockDatabaseMetaData.java | 941 +++++++++++++ .../organization/mock/MockJDBCDriver.java | 69 + .../organization/mock/MockResultSet.java | 1113 +++++++++++++++ .../organization/mock/MockStatement.java | 561 ++++++++ .../carbon-home/dbscripts/dm-db-h2.sql | 890 ++++++++++++ .../resources/carbon-home/dbscripts/h2.sql | 65 + .../repository/conf/axis2/axis2.xml | 726 ++++++++++ .../repository/conf/axis2/axis2_client.xml | 302 ++++ .../repository/conf/axis2/tenant-axis2.xml | 287 ++++ .../carbon-home/repository/conf/carbon.xml | 659 +++++++++ .../repository/conf/cdm-config.xml | 171 +++ .../conf/datasources/data-source-config.xml | 24 + .../conf/etc/bundle-config/README.txt | 12 + .../carboncontext-osgi-services.properties | 21 + .../repository/conf/etc/config-validation.xml | 55 + .../carbon-home/repository/conf/etc/jmx.xml | 34 + .../repository/conf/etc/launch.ini | 258 ++++ .../conf/etc/logging-bridge.properties | 72 + .../repository/conf/etc/mime.mappings | 27 + .../repository/conf/etc/mime.types | 734 ++++++++++ .../repository/conf/etc/osgi-debug.options | 95 ++ .../repository/conf/etc/tasks-config.xml | 69 + .../repository/conf/log4j.properties | 32 + .../carbon-home/repository/conf/registry.xml | 108 ++ .../conf/security/authenticators.xml | 75 + .../conf/tomcat/carbon/META-INF/context.xml | 35 + .../conf/tomcat/carbon/WEB-INF/web.xml | 61 + .../conf/tomcat/catalina-server.xml | 98 ++ .../repository/conf/tomcat/tomcat-users.xml | 34 + .../repository/conf/tomcat/web.xml | 1222 +++++++++++++++++ .../carbon-home/repository/conf/user-mgt.xml | 382 ++++++ .../datasource/data-source-config-mock.xml | 33 + .../data-source-config-no-table.xml | 33 + .../config/datasource/data-source-config.xml | 33 + .../mssql/data-source-config-mock.xml | 33 + .../mssql/data-source-config-no-table.xml | 33 + .../datasource/mssql/data-source-config.xml | 33 + .../mysql/data-source-config-mock.xml | 33 + .../mysql/data-source-config-no-table.xml | 33 + .../datasource/mysql/data-source-config.xml | 33 + .../oracle/data-source-config-mock.xml | 33 + .../oracle/data-source-config-no-table.xml | 33 + .../datasource/oracle/data-source-config.xml | 33 + .../postgre/data-source-config-mock.xml | 33 + .../postgre/data-source-config-no-table.xml | 33 + .../datasource/postgre/data-source-config.xml | 33 + ...management-config-no-client-key-secret.xml | 23 + ...ormed-app-management-config-no-enabled.xml | 24 + .../malformed-cdm-config-no-ds-config.xml | 29 + .../malformed-cdm-config-no-jndi-config.xml | 29 + .../malformed-cdm-config-no-mgt-repo.xml | 29 + .../resources/config/operation/cdm-config.xml | 152 ++ .../config/operation/traccar-config.xml | 37 + .../config/schema/app-mgt-config-schema.xsd | 31 + .../schema/device-mgt-config-schema.xsd | 48 + .../src/test/resources/log4j.properties | 34 + .../src/test/resources/mysql-testng.xml | 41 + .../src/test/resources/sql/h2.sql | 672 +++++++++ .../src/test/resources/testng.xml | 37 + .../user-test/user-mgt-registry-test.xml | 101 ++ components/device-mgt-extensions/pom.xml | 2 + .../pom.xml | 120 ++ .../src/main/resources/build.properties | 19 + .../src/main/resources/p2.inf | 3 + .../pom.xml | 106 ++ .../src/main/resources/build.properties | 19 + .../src/main/resources/p2.inf | 1 + features/device-mgt-extensions/pom.xml | 2 + .../src/main/resources/conf/mdm-ui-config.xml | 5 +- .../src/main/resources/dbscripts/cdm/h2.sql | 19 + .../main/resources/dbscripts/cdm/mssql.sql | 17 + .../main/resources/dbscripts/cdm/mysql.sql | 17 + .../main/resources/dbscripts/cdm/oracle.sql | 38 +- .../resources/dbscripts/cdm/postgresql.sql | 19 + pom.xml | 10 + 123 files changed, 20142 insertions(+), 3 deletions(-) create mode 100644 components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization.api/pom.xml create mode 100644 components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization.api/src/main/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/api/ApiOriginFilter.java create mode 100644 components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization.api/src/main/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/api/DeviceOrganizationMgtService.java create mode 100644 components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization.api/src/main/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/api/DeviceOrganizationMgtServiceImpl.java create mode 100644 components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization.api/src/main/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/api/beans/ErrorListItem.java create mode 100644 components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization.api/src/main/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/api/beans/ErrorResponse.java create mode 100644 components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization.api/src/main/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/api/beans/GsonMessageBodyHandler.java create mode 100644 components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization.api/src/main/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/api/beans/SuccessResponse.java create mode 100644 components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization.api/src/main/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/api/beans/ValidationInterceptor.java create mode 100644 components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization.api/src/main/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/api/util/DeviceOrgAPIUtils.java create mode 100644 components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization.api/src/main/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/api/util/DeviceOrgConstants.java create mode 100644 components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization.api/src/main/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/api/util/InputValidationException.java create mode 100644 components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization.api/src/main/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/api/util/RequestValidationUtil.java create mode 100644 components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization.api/src/main/webapp/META-INF/webapp-classloading.xml create mode 100644 components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization.api/src/main/webapp/WEB-INF/cxf-servlet.xml create mode 100644 components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization.api/src/main/webapp/WEB-INF/web.xml create mode 100644 components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/pom.xml create mode 100644 components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/main/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/dao/DeviceOrganizationDAO.java create mode 100644 components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/main/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/dao/DeviceOrganizationDAOFactory.java create mode 100644 components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/main/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/dao/impl/DeviceOrganizationDAOImpl.java create mode 100644 components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/main/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/dao/impl/DeviceOrganizationMysqlDAOImpl.java create mode 100644 components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/main/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/dao/util/ConnectionManagerUtil.java create mode 100644 components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/main/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/dao/util/DeviceOrganizationDaoUtil.java create mode 100644 components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/main/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/dto/AdditionResult.java create mode 100644 components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/main/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/dto/DeviceNode.java create mode 100644 components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/main/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/dto/DeviceNodeResult.java create mode 100644 components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/main/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/dto/DeviceOrganization.java create mode 100644 components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/main/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/dto/PaginationRequest.java create mode 100644 components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/main/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/exception/BadRequestDaoException.java create mode 100644 components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/main/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/exception/BadRequestException.java create mode 100644 components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/main/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/exception/DBConnectionException.java create mode 100644 components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/main/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/exception/DeviceOrganizationMgtDAOException.java create mode 100644 components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/main/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/exception/DeviceOrganizationMgtPluginException.java create mode 100644 components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/main/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/exception/UnsupportedDatabaseEngineException.java create mode 100644 components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/main/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/impl/DeviceOrganizationServiceImpl.java create mode 100644 components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/main/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/internal/DeviceOrganizationMgtDataHolder.java create mode 100644 components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/main/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/internal/DeviceOrganizationMgtServiceComponent.java create mode 100644 components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/main/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/spi/DeviceOrganizationService.java create mode 100644 components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/DAONegativeTest.java create mode 100644 components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/DAOTest.java create mode 100644 components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/DataSourceConfig.java create mode 100644 components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/ServiceNegativeTest.java create mode 100644 components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/ServiceTest.java create mode 100644 components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/TestUtils.java create mode 100644 components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/mock/BaseDeviceOrganizationTest.java create mode 100644 components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/mock/MockConnection.java create mode 100644 components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/mock/MockDataSource.java create mode 100644 components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/mock/MockDatabaseMetaData.java create mode 100644 components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/mock/MockJDBCDriver.java create mode 100644 components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/mock/MockResultSet.java create mode 100644 components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/mock/MockStatement.java create mode 100644 components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/carbon-home/dbscripts/dm-db-h2.sql create mode 100644 components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/carbon-home/dbscripts/h2.sql create mode 100644 components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/carbon-home/repository/conf/axis2/axis2.xml create mode 100644 components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/carbon-home/repository/conf/axis2/axis2_client.xml create mode 100644 components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/carbon-home/repository/conf/axis2/tenant-axis2.xml create mode 100644 components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/carbon-home/repository/conf/carbon.xml create mode 100644 components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/carbon-home/repository/conf/cdm-config.xml create mode 100644 components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/carbon-home/repository/conf/datasources/data-source-config.xml create mode 100644 components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/carbon-home/repository/conf/etc/bundle-config/README.txt create mode 100644 components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/carbon-home/repository/conf/etc/carboncontext-osgi-services.properties create mode 100644 components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/carbon-home/repository/conf/etc/config-validation.xml create mode 100644 components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/carbon-home/repository/conf/etc/jmx.xml create mode 100644 components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/carbon-home/repository/conf/etc/launch.ini create mode 100644 components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/carbon-home/repository/conf/etc/logging-bridge.properties create mode 100644 components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/carbon-home/repository/conf/etc/mime.mappings create mode 100644 components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/carbon-home/repository/conf/etc/mime.types create mode 100644 components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/carbon-home/repository/conf/etc/osgi-debug.options create mode 100644 components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/carbon-home/repository/conf/etc/tasks-config.xml create mode 100644 components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/carbon-home/repository/conf/log4j.properties create mode 100644 components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/carbon-home/repository/conf/registry.xml create mode 100644 components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/carbon-home/repository/conf/security/authenticators.xml create mode 100644 components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/carbon-home/repository/conf/tomcat/carbon/META-INF/context.xml create mode 100644 components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/carbon-home/repository/conf/tomcat/carbon/WEB-INF/web.xml create mode 100644 components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/carbon-home/repository/conf/tomcat/catalina-server.xml create mode 100644 components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/carbon-home/repository/conf/tomcat/tomcat-users.xml create mode 100644 components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/carbon-home/repository/conf/tomcat/web.xml create mode 100644 components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/carbon-home/repository/conf/user-mgt.xml create mode 100644 components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/config/datasource/data-source-config-mock.xml create mode 100644 components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/config/datasource/data-source-config-no-table.xml create mode 100644 components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/config/datasource/data-source-config.xml create mode 100644 components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/config/datasource/mssql/data-source-config-mock.xml create mode 100644 components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/config/datasource/mssql/data-source-config-no-table.xml create mode 100644 components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/config/datasource/mssql/data-source-config.xml create mode 100644 components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/config/datasource/mysql/data-source-config-mock.xml create mode 100644 components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/config/datasource/mysql/data-source-config-no-table.xml create mode 100644 components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/config/datasource/mysql/data-source-config.xml create mode 100644 components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/config/datasource/oracle/data-source-config-mock.xml create mode 100644 components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/config/datasource/oracle/data-source-config-no-table.xml create mode 100644 components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/config/datasource/oracle/data-source-config.xml create mode 100644 components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/config/datasource/postgre/data-source-config-mock.xml create mode 100644 components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/config/datasource/postgre/data-source-config-no-table.xml create mode 100644 components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/config/datasource/postgre/data-source-config.xml create mode 100644 components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/config/malformed-app-management-config-no-client-key-secret.xml create mode 100644 components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/config/malformed-app-management-config-no-enabled.xml create mode 100644 components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/config/malformed-cdm-config-no-ds-config.xml create mode 100644 components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/config/malformed-cdm-config-no-jndi-config.xml create mode 100644 components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/config/malformed-cdm-config-no-mgt-repo.xml create mode 100644 components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/config/operation/cdm-config.xml create mode 100644 components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/config/operation/traccar-config.xml create mode 100644 components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/config/schema/app-mgt-config-schema.xsd create mode 100644 components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/config/schema/device-mgt-config-schema.xsd create mode 100644 components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/log4j.properties create mode 100644 components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/mysql-testng.xml create mode 100644 components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/sql/h2.sql create mode 100644 components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/testng.xml create mode 100644 components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/user-test/user-mgt-registry-test.xml create mode 100644 features/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization.api.feature/pom.xml create mode 100644 features/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization.api.feature/src/main/resources/build.properties create mode 100644 features/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization.api.feature/src/main/resources/p2.inf create mode 100644 features/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization.feature/pom.xml create mode 100644 features/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization.feature/src/main/resources/build.properties create mode 100644 features/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization.feature/src/main/resources/p2.inf diff --git a/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.application.extension.api/src/main/java/io/entgra/device/mgt/core/apimgt/application/extension/api/util/APIUtil.java b/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.application.extension.api/src/main/java/io/entgra/device/mgt/core/apimgt/application/extension/api/util/APIUtil.java index 3be91a559e..3c35514c40 100644 --- a/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.application.extension.api/src/main/java/io/entgra/device/mgt/core/apimgt/application/extension/api/util/APIUtil.java +++ b/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.application.extension.api/src/main/java/io/entgra/device/mgt/core/apimgt/application/extension/api/util/APIUtil.java @@ -51,6 +51,8 @@ public class APIUtil { private static final String DEFAULT_ENTERPRISE_TAG= "androidforwork"; private static final String DEFAULT_ANALYTICS_MGT_TAG= "analytics_management"; + private static final String DEFAULT_DEVICE_ORGANIZATION_MGT_TAG= "device_organization_management"; + public static final String PERMISSION_PROPERTY_NAME = "name"; public static String getAuthenticatedUser() { @@ -121,6 +123,7 @@ public class APIUtil { allowedApisTags.add(DEFAULT_ANALYTICS_ARTIFACT_TAG); allowedApisTags.add(DEFAULT_TRANSPORT_MGT_TAG); allowedApisTags.add(DEFAULT_ANALYTICS_MGT_TAG); + allowedApisTags.add(DEFAULT_DEVICE_ORGANIZATION_MGT_TAG); // In an environment only super tenant should be capable of calling this API tag if (PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId() == MultitenantConstants.SUPER_TENANT_ID) { 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 new file mode 100644 index 0000000000..21fd9d2457 --- /dev/null +++ b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization.api/pom.xml @@ -0,0 +1,344 @@ + + + + + + + device-mgt-extensions + io.entgra.device.mgt.core + 5.0.40-SNAPSHOT + ../pom.xml + + + 4.0.0 + io.entgra.device.mgt.core.device.mgt.extensions.device.organization.api + war + Entgra IoT - API Device Organization Management API + This module extends the API manager's device organization management apis. + http://entgra.io + + + + + maven-compiler-plugin + + 1.8 + 1.8 + + + + maven-war-plugin + + WEB-INF/lib/*cxf*.jar + api#device-org#v1.0 + + + + org.jacoco + jacoco-maven-plugin + + ${basedir}/target/coverage-reports/jacoco-unit.exec + + + + jacoco-initialize + + prepare-agent + + + + jacoco-site + test + + report + + + ${basedir}/target/coverage-reports/jacoco-unit.exec + ${basedir}/target/coverage-reports/site + + + + + + + + + + deploy + + compile + + + org.apache.maven.plugins + maven-antrun-plugin + 1.7 + + + compile + + run + + + + + + + + + + + + + + + + + + client + + test + + + org.codehaus.mojo + exec-maven-plugin + 1.2.1 + + + test + + java + + + + + + + + + + + + org.testng + testng + test + + + org.springframework + spring-web + provided + + + org.apache.cxf + cxf-bundle + 3.0.0-milestone2 + test + + + org.apache.cxf + cxf-bundle-jaxrs + provided + + + commons-httpclient.wso2 + commons-httpclient + provided + + + org.wso2.carbon + org.wso2.carbon.utils + provided + + + org.wso2.carbon.identity.framework + org.wso2.carbon.user.mgt + provided + + + org.slf4j + slf4j-api + + + org.slf4j + jcl-over-slf4j + + + + + org.wso2.carbon + org.wso2.carbon.logging + provided + + + org.wso2.carbon.identity.inbound.auth.oauth2 + org.wso2.carbon.identity.oauth.stub + provided + + + org.apache.axis2.wso2 + axis2-client + + + + + org.json.wso2 + json + + + commons-codec.wso2 + commons-codec + provided + + + io.entgra.device.mgt.core + io.entgra.device.mgt.core.device.mgt.extensions.device.organization + ${io.entgra.device.mgt.core.version} + provided + + + com.google.code.gson + gson + + + io.swagger + swagger-annotations + + + io.swagger + swagger-core + + + com.fasterxml.jackson.module + jackson-module-jaxb-annotations + + + org.slf4j + slf4j-api + + + org.wso2.orbit.com.fasterxml.jackson.core + jackson-core + + + + + io.swagger + swagger-jaxrs + + + com.fasterxml.jackson.module + jackson-module-jaxb-annotations + + + org.slf4j + slf4j-api + + + org.wso2.orbit.com.fasterxml.jackson.core + jackson-core + + + + + javax.servlet + javax.servlet-api + provided + + + io.entgra.device.mgt.core + io.entgra.device.mgt.core.apimgt.annotations + provided + + + org.wso2.orbit.com.fasterxml.jackson.core + jackson-annotations + + + org.hibernate + hibernate-validator + + + javax.ws.rs + javax.ws.rs-api + provided + + + javax.ws.rs + jsr311-api + provided + + + org.wso2.carbon.commons + org.wso2.carbon.application.mgt.stub + provided + + + io.entgra.device.mgt.core + io.entgra.device.mgt.core.identity.jwt.client.extension + provided + + + org.wso2.carbon + org.wso2.carbon.registry.core + provided + + + org.wso2.carbon.registry + org.wso2.carbon.registry.resource + provided + + + org.wso2.carbon.identity.framework + org.wso2.carbon.identity.user.store.count + ${carbon.identity.framework.version} + provided + + + org.powermock + powermock-module-testng + test + + + org.powermock + powermock-api-mockito + test + + + io.entgra.device.mgt.core + io.entgra.device.mgt.core.device.mgt.common + provided + + + io.entgra.device.mgt.core + io.entgra.device.mgt.core.device.mgt.extensions + provided + + + org.wso2.carbon.identity.framework + org.wso2.carbon.identity.claim.metadata.mgt + ${carbon.identity.framework.version} + provided + + + io.entgra.device.mgt.core + io.entgra.device.mgt.core.device.mgt.core + provided + + + + diff --git a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization.api/src/main/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/api/ApiOriginFilter.java b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization.api/src/main/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/api/ApiOriginFilter.java new file mode 100644 index 0000000000..4d16481e7f --- /dev/null +++ b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization.api/src/main/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/api/ApiOriginFilter.java @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2018 - 2023, 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.device.mgt.extensions.device.organization.api; + +import javax.servlet.Filter; +import javax.servlet.FilterChain; +import javax.servlet.FilterConfig; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +public class ApiOriginFilter implements Filter { + + public void doFilter(ServletRequest request, ServletResponse response, + FilterChain chain) throws IOException, ServletException { + HttpServletResponse res = (HttpServletResponse) response; + res.addHeader("Access-Control-Allow-Origin", "*"); + res.addHeader("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT"); + res.addHeader("Access-Control-Allow-Headers", "Content-Type"); + chain.doFilter(request, response); + } + + public void destroy() { + //do nothing + } + + public void init(FilterConfig filterConfig) throws ServletException { + //do nothing + } + +} diff --git a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization.api/src/main/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/api/DeviceOrganizationMgtService.java b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization.api/src/main/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/api/DeviceOrganizationMgtService.java new file mode 100644 index 0000000000..cfc669c767 --- /dev/null +++ b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization.api/src/main/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/api/DeviceOrganizationMgtService.java @@ -0,0 +1,793 @@ +/* + * Copyright (c) 2018 - 2023, 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.device.mgt.extensions.device.organization.api; + +import io.entgra.device.mgt.core.device.mgt.extensions.device.organization.api.util.DeviceOrgConstants; +import io.entgra.device.mgt.core.apimgt.annotations.Scope; +import io.entgra.device.mgt.core.apimgt.annotations.Scopes; +import io.entgra.device.mgt.core.device.mgt.extensions.device.organization.api.beans.ErrorResponse; +import io.entgra.device.mgt.core.device.mgt.extensions.device.organization.dto.DeviceOrganization; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import io.swagger.annotations.ApiResponse; +import io.swagger.annotations.ApiResponses; +import io.swagger.annotations.Extension; +import io.swagger.annotations.ExtensionProperty; +import io.swagger.annotations.Info; +import io.swagger.annotations.ResponseHeader; +import io.swagger.annotations.SwaggerDefinition; +import io.swagger.annotations.Tag; + +import javax.ws.rs.Consumes; +import javax.ws.rs.DELETE; +import javax.ws.rs.DefaultValue; +import javax.ws.rs.GET; +import javax.ws.rs.POST; +import javax.ws.rs.PUT; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.Produces; +import javax.ws.rs.QueryParam; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; + +/** + * This interface defines the RESTful web service endpoints for managing device organizations. + */ + +@SwaggerDefinition( + info = @Info( + version = "1.0.0", + title = "", + extensions = { + @Extension(properties = { + @ExtensionProperty(name = "name", value = "DeviceOrganizationManagement"), + @ExtensionProperty(name = "context", value = "/api/device-org/v1.0"), + }) + } + ), + tags = { + @Tag(name = "device_organization_management", description = "Device organization " + + "management related REST-API. This can be used to manipulate device organization related details.") + } +) + +@Api(value = "Device Organization Management", description = "This API carries all device organization management " + + "related operations.") +@Path("/") +@Produces(MediaType.APPLICATION_JSON) +@Consumes(MediaType.APPLICATION_JSON) +@Scopes(scopes = { + @Scope( + name = "View Device Organization", + description = "View Device Organization", + key = "dm:device-org:view", + roles = {"Internal/devicemgt-user"}, + permissions = {"/device-mgt/organization/view"} + ), + @Scope( + name = "Add Device Organization", + description = "Add Device Organization", + key = "dm:device-org:add", + roles = {"Internal/devicemgt-user"}, + permissions = {"/device-mgt/organization/add"} + ), + @Scope( + name = "Modify Device Organization", + description = "Modify Device Organization", + key = "dm:device-org:modify", + roles = {"Internal/devicemgt-user"}, + permissions = {"/device-mgt/organization/modify"} + ), + @Scope( + name = "Delete Device Organization", + description = "Delete Device Organization", + key = "dm:device-org:delete", + roles = {"Internal/devicemgt-user"}, + permissions = {"/device-mgt/organization/delete"} + ), +} +) +public interface DeviceOrganizationMgtService { + + String SCOPE = DeviceOrgConstants.SCOPE; + + /** + * Adds a new device organization. + * + * @param request The request containing the device organization information. + * @return A response indicating the success or failure of the operation. + */ + @POST + @ApiOperation( + consumes = MediaType.APPLICATION_JSON, + produces = MediaType.APPLICATION_JSON, + httpMethod = "POST", + value = "Add a new device Organization.", + notes = "This endpoint allows you to add a new device organization.", + tags = "Device Organization Management", + extensions = { + @Extension(properties = { + @ExtensionProperty(name = SCOPE, value = "dm:device-org:add") + }) + } + ) + @ApiResponses( + value = { + @ApiResponse( + code = 201, + message = "OK. \n Successfully created the device organization.", + responseHeaders = { + @ResponseHeader( + name = "Content-Type", + description = "The content type of the body"), + @ResponseHeader( + name = "ETag", + description = "Entity Tag of the response resource.\n" + + "Used by caches, or in conditional requests."), + @ResponseHeader( + name = "Last-Modified", + description = + "Date and time the resource was last modified.\n" + + "Used by caches, or in conditional requests."), + }), + @ApiResponse( + code = 400, + message = + "Bad Request. \n"), + @ApiResponse( + code = 406, + message = "Not Acceptable.\n The requested media type is not supported"), + @ApiResponse( + code = 500, + message = "Internal Server Error. \n Server error occurred while fetching the " + + "list of supported device types.", + response = ErrorResponse.class) + }) + Response addDeviceOrganization(DeviceOrganization request); + + /** + * Retrieves a list of child nodes of a given device node, up to a specified depth. + * + * @param deviceId The ID of the parent device node. + * @param maxDepth The maximum depth of child nodes to retrieve. + * @param includeDevice Indicates whether to include device information in the retrieved nodes. + * @return A response containing a list of child device nodes. + */ + @GET + @Path("children") + @ApiOperation( + produces = MediaType.APPLICATION_JSON, + httpMethod = "GET", + value = "Get Child Nodes of a Device Node", + notes = "This endpoint allows you to retrieve a list of child nodes of a given device node up to a specified depth.", + tags = "Device Organization Management", + extensions = { + @Extension(properties = { + @ExtensionProperty(name = SCOPE, value = "dm:device-org:view") + }) + } + ) + @ApiResponses( + value = { + @ApiResponse( + code = 200, + message = "OK. \n Successfully fetched the child devices.", + responseHeaders = { + @ResponseHeader( + name = "Content-Type", + description = "The content type of the body"), + @ResponseHeader( + name = "ETag", + description = "Entity Tag of the response resource.\n" + + "Used by caches, or in conditional requests."), + @ResponseHeader( + name = "Last-Modified", + description = + "Date and time the resource was last modified.\n" + + "Used by caches, or in conditional requests."), + } + ), + @ApiResponse( + code = 400, + message = + "Bad Request. \n"), + @ApiResponse( + code = 406, + message = "Not Acceptable.\n The requested media type is not supported"), + @ApiResponse( + code = 500, + message = "Internal Server Error. \n Server error occurred while fetching the " + + "list of supported device types.", + response = ErrorResponse.class) + }) + Response getChildrenOfDeviceNode( + @ApiParam(value = "The ID of the parent device node.", required = true) + @QueryParam("deviceId") int deviceId, + @ApiParam(value = "The maximum depth of child nodes to retrieve.", required = true) + @QueryParam("maxDepth") int maxDepth, + @ApiParam(value = "Indicates whether to include device information in the retrieved nodes.", required = true) + @QueryParam("includeDevice") boolean includeDevice + ); + + + /** + * Retrieves a list of parent nodes of a given device node, up to a specified depth. + * + * @param deviceId The ID of the child device node. + * @param maxDepth The maximum depth of parent nodes to retrieve. + * @param includeDevice Indicates whether to include device information in the retrieved nodes. + * @return A response containing a list of parent device nodes. + */ + @GET + @Path("parents") + @ApiOperation( + produces = MediaType.APPLICATION_JSON, + httpMethod = "GET", + value = "Retrieve Parent Nodes of a Device Node", + notes = "Get a list of parent nodes of a specified child device node, up to a specified depth.", + tags = "Device Organization Management", + extensions = { + @Extension(properties = { + @ExtensionProperty(name = SCOPE, value = "dm:device-org:view") + }) + } + ) + @ApiResponses( + value = { + @ApiResponse( + code = 200, + message = "OK. \n Successfully fetched the parent devices.", + responseHeaders = { + @ResponseHeader( + name = "Content-Type", + description = "The content type of the body"), + @ResponseHeader( + name = "ETag", + description = "Entity Tag of the response resource.\n" + + "Used by caches, or in conditional requests."), + @ResponseHeader( + name = "Last-Modified", + description = + "Date and time the resource was last modified.\n" + + "Used by caches, or in conditional requests."), + } + ), + @ApiResponse( + code = 400, + message = + "Bad Request. \n"), + @ApiResponse( + code = 406, + message = "Not Acceptable.\n The requested media type is not supported"), + @ApiResponse( + code = 500, + message = "Internal Server Error. \n Server error occurred while fetching the " + + "list of supported device types.", + response = ErrorResponse.class) + }) + Response getParentsOfDeviceNode( + @ApiParam(value = "The ID of the child device node.", required = true) + @QueryParam("deviceId") int deviceId, + @ApiParam(value = "The maximum depth of parent nodes to retrieve.", required = true) + @QueryParam("maxDepth") int maxDepth, + @ApiParam(value = "Indicates whether to include device information in the retrieved nodes.", required = true) + @QueryParam("includeDevice") boolean includeDevice); + + + /** + * Retrieves a list of leaf device organizations. + * + * @return A response containing a list of leaf device organizations. + */ + @GET + @Path("leafs") + @ApiOperation( + produces = MediaType.APPLICATION_JSON, + httpMethod = "GET", + value = "Retrieve leaf Device Organizations", + notes = "Get a list of leaf device organizations.", + tags = "Device Organization Management", + extensions = { + @Extension(properties = { + @ExtensionProperty(name = SCOPE, value = "dm:device-org:view") + }) + } + ) + @ApiResponses( + value = { + @ApiResponse( + code = 200, + message = "OK. \n Successfully fetched the all devices.", + responseHeaders = { + @ResponseHeader( + name = "Content-Type", + description = "The content type of the body"), + @ResponseHeader( + name = "ETag", + description = "Entity Tag of the response resource.\n" + + "Used by caches, or in conditional requests."), + @ResponseHeader( + name = "Last-Modified", + description = + "Date and time the resource was last modified.\n" + + "Used by caches, or in conditional requests."), + } + ), + @ApiResponse( + code = 400, + message = + "Bad Request. \n"), + @ApiResponse( + code = 406, + message = "Not Acceptable.\n The requested media type is not supported"), + @ApiResponse( + code = 500, + message = "Internal Server Error. \n Server error occurred while fetching the " + + "list of supported device types.", + response = ErrorResponse.class) + }) + Response getDeviceOrganizationLeafs( + @ApiParam( + name = "offset", + value = "The starting pagination index for the complete list of qualified items", + required = false, + defaultValue = "0") + @DefaultValue("0") @QueryParam("offset") + int offset, + @ApiParam( + name = "limit", + value = "Provide how many policy details you require from the starting pagination index/offset.", + required = false, + defaultValue = "5") + @DefaultValue("20") @QueryParam("limit") + int limit); + + /** + * Retrieves a list of root device organizations. + * + * @return A response containing a list of root device organizations. + */ + @GET + @Path("roots") + @ApiOperation( + produces = MediaType.APPLICATION_JSON, + httpMethod = "GET", + value = "Retrieve leaf Device Organizations", + notes = "Get a list of leaf device organizations.", + tags = "Device Organization Management", + extensions = { + @Extension(properties = { + @ExtensionProperty(name = SCOPE, value = "dm:device-org:view") + }) + } + ) + @ApiResponses( + value = { + @ApiResponse( + code = 200, + message = "OK. \n Successfully fetched the all devices.", + responseHeaders = { + @ResponseHeader( + name = "Content-Type", + description = "The content type of the body"), + @ResponseHeader( + name = "ETag", + description = "Entity Tag of the response resource.\n" + + "Used by caches, or in conditional requests."), + @ResponseHeader( + name = "Last-Modified", + description = + "Date and time the resource was last modified.\n" + + "Used by caches, or in conditional requests."), + } + ), + @ApiResponse( + code = 400, + message = + "Bad Request. \n"), + @ApiResponse( + code = 406, + message = "Not Acceptable.\n The requested media type is not supported"), + @ApiResponse( + code = 500, + message = "Internal Server Error. \n Server error occurred while fetching the " + + "list of supported device types.", + response = ErrorResponse.class) + }) + Response getDeviceOrganizationRoots( + @ApiParam( + name = "offset", + value = "The starting pagination index for the complete list of qualified items", + required = false, + defaultValue = "0") + @DefaultValue("0") @QueryParam("offset") + int offset, + @ApiParam( + name = "limit", + value = "Provide how many policy details you require from the starting pagination index/offset.", + required = false, + defaultValue = "5") + @DefaultValue("20") @QueryParam("limit") + int limit); + + /** + * Retrieves a specific device organization by its organization ID. + * + * @param organizationId The organization ID of the device organization to retrieve. + * @return A response containing the device organization with the specified ID. + */ + @GET + @Path("{organizationId}") + @ApiOperation( + produces = MediaType.APPLICATION_JSON, + httpMethod = "GET", + value = "Retrieve Device Organization by ID", + notes = "Get a specific device organization by its ID.", + tags = "Device Organization Management", + extensions = { + @Extension(properties = { + @ExtensionProperty(name = SCOPE, value = "dm:device-org:view") + }) + } + ) + @ApiResponses( + value = { + @ApiResponse( + code = 200, + message = "OK. \n Successfully fetched the device organization by ID.", + responseHeaders = { + @ResponseHeader( + name = "Content-Type", + description = "The content type of the body"), + @ResponseHeader( + name = "ETag", + description = "Entity Tag of the response resource.\n" + + "Used by caches, or in conditional requests."), + @ResponseHeader( + name = "Last-Modified", + description = + "Date and time the resource was last modified.\n" + + "Used by caches, or in conditional requests."), + } + ), + @ApiResponse( + code = 400, + message = + "Bad Request. \n"), + @ApiResponse( + code = 406, + message = "Not Acceptable.\n The requested media type is not supported"), + @ApiResponse( + code = 500, + message = "Internal Server Error. \n Server error occurred while fetching the " + + "list of supported device types.", + response = ErrorResponse.class) + }) + Response getDeviceOrganizationById(@PathParam("organizationId") int organizationId); + + + /** + * Checks if a device organization with the specified device and parent device IDs already exists. + * + * @param deviceId The ID of the device. + * @param parentDeviceId The ID of the parent device. + * @return A response indicating whether the organization exists or not. + */ + @GET + @Path("exists/{deviceId}/{parentDeviceId}") + @ApiOperation( + produces = MediaType.APPLICATION_JSON, + httpMethod = "GET", + value = "Check Device Organization Existence", + notes = "Check if a device organization with the specified device and parent device IDs exists.", + tags = "Device Organization Management", + extensions = { + @Extension(properties = { + @ExtensionProperty(name = SCOPE, value = "dm:device-org:view") + }) + } + ) + @ApiResponses( + value = { + @ApiResponse( + code = 200, + message = "OK. \n Successfull. The device organization exists.", + responseHeaders = { + @ResponseHeader( + name = "Content-Type", + description = "The content type of the body"), + @ResponseHeader( + name = "ETag", + description = "Entity Tag of the response resource.\n" + + "Used by caches, or in conditional requests."), + @ResponseHeader( + name = "Last-Modified", + description = + "Date and time the resource was last modified.\n" + + "Used by caches, or in conditional requests."), + } + ), + @ApiResponse( + code = 400, + message = + "Bad Request. \n"), + @ApiResponse( + code = 406, + message = "Not Acceptable.\n The requested media type is not supported"), + @ApiResponse( + code = 500, + message = "Internal Server Error. \n Server error occurred while fetching the " + + "list of supported device types.", + response = ErrorResponse.class) + }) + Response isDeviceOrganizationExist( + @ApiParam(name = "deviceId", value = "The ID of the child device.", required = true) + @PathParam("deviceId") int deviceId, + @ApiParam(name = "parentDeviceId", value = "The ID of the parent device.") + @PathParam("parentDeviceId") String parentDeviceId); + + + /** + * Retrieve a device organization by its unique key (deviceId and parentDeviceId). + * + * @param deviceId The ID of the device. + * @param parentDeviceId The ID of the parent device. + * @return A response containing the retrieved DeviceOrganization object, or null if not found. + */ + @GET + @Path("organization/{deviceId}/{parentDeviceId}") + @ApiOperation( + produces = MediaType.APPLICATION_JSON, + httpMethod = "GET", + value = "Get Device Organization by Unique Key", + notes = "Retrieve a device organization by its unique key, which is a combination of deviceId and parentDeviceId.", + tags = "Device Organization Management", + extensions = { + @Extension(properties = { + @ExtensionProperty(name = SCOPE, value = "dm:device-org:view") + }) + } + ) + @ApiResponses( + value = { + @ApiResponse( + code = 200, + message = "OK. \n Successfully retrieved organization details.", + responseHeaders = { + @ResponseHeader( + name = "Content-Type", + description = "The content type of the body"), + @ResponseHeader( + name = "ETag", + description = "Entity Tag of the response resource.\n" + + "Used by caches, or in conditional requests."), + @ResponseHeader( + name = "Last-Modified", + description = + "Date and time the resource was last modified.\n" + + "Used by caches, or in conditional requests."), + } + ), + @ApiResponse( + code = 400, + message = + "Bad Request. \n"), + @ApiResponse( + code = 404, + message = + "Not Found. \n"), + @ApiResponse( + code = 406, + message = "Not Acceptable.\n The requested media type is not supported"), + @ApiResponse( + code = 500, + message = "Internal Server Error. \n Server error occurred while fetching the " + + "list of supported device types.", + response = ErrorResponse.class) + }) + Response getDeviceOrganizationByUniqueKey( + @ApiParam(name = "deviceId", value = "The ID of the child device.", required = true) + @PathParam("deviceId") int deviceId, + @ApiParam(name = "parentDeviceId", value = "The ID of the parent device.") + @PathParam("parentDeviceId") String parentDeviceId); + + /** + * Updates a device organization. + * + * @param deviceOrganization The updated device organization. + * @return A response indicating the success or failure of the operation. + */ + @PUT + @ApiOperation( + consumes = MediaType.APPLICATION_JSON, + produces = MediaType.APPLICATION_JSON, + httpMethod = "PUT", + value = "Update a Device Organization", + notes = "This endpoint allows you to update a device organization.", + tags = "Device Organization Management", + extensions = { + @Extension(properties = { + @ExtensionProperty(name = SCOPE, value = "dm:device-org:modify") + }) + } + ) + @ApiResponses( + value = { + @ApiResponse( + code = 200, + message = "OK. \n Successfully updated device organization.", + responseHeaders = { + @ResponseHeader( + name = "Content-Type", + description = "The content type of the body"), + @ResponseHeader( + name = "ETag", + description = "Entity Tag of the response resource.\n" + + "Used by caches, or in conditional requests."), + @ResponseHeader( + name = "Last-Modified", + description = "Date and time the resource was last modified.\n" + + "Used by caches, or in conditional requests."), + }), + @ApiResponse( + code = 304, + message = "Not Modified. Empty body because the client already has the latest version" + + " of the requested resource.\n"), + @ApiResponse( + code = 400, + message = "Bad Request. \n Invalid request or validation error.", + response = ErrorResponse.class), + @ApiResponse( + code = 404, + message = "Not Found. \n A deviceType with the specified device type was not found.", + response = ErrorResponse.class), + @ApiResponse( + code = 500, + message = "Internal Server Error. \n " + + "Server error occurred while retrieving the device details.", + response = ErrorResponse.class) + }) + Response updateDeviceOrganization( + @ApiParam(value = "The updated device organization.", required = true) + DeviceOrganization deviceOrganization); + + + /** + * Deletes a device organization by its organization ID. + * + * @param organizationId The organization ID of the device organization to delete. + * @return A response indicating the success or failure of the operation. + */ + @DELETE + @Path("{organizationId}") + @ApiOperation( + httpMethod = "DELETE", + value = "Delete a Device Organization", + notes = "This endpoint allows you to delete a device organization by its organization ID.", + tags = "Device Organization Management", + extensions = { + @Extension(properties = { + @ExtensionProperty(name = SCOPE, value = "dm:device-org:delete") + }) + } + ) + @ApiResponses( + value = { + @ApiResponse( + code = 200, + message = "OK. \n Successfully deleted the device organization.", + responseHeaders = { + @ResponseHeader( + name = "Content-Type", + description = "The content type of the body"), + @ResponseHeader( + name = "ETag", + description = "Entity Tag of the response resource.\n" + + "Used by caches, or in conditional requests."), + @ResponseHeader( + name = "Last-Modified", + description = "Date and time the resource was last modified.\n" + + "Used by caches, or in conditional requests."), + }), + @ApiResponse( + code = 304, + message = "Not Modified. Empty body because the client already has the latest version" + + " of the requested resource.\n"), + @ApiResponse( + code = 400, + message = "Bad Request. \n Invalid request or validation error.", + response = ErrorResponse.class), + @ApiResponse( + code = 404, + message = "Not Found. \n A deviceType with the specified device type was not found.", + response = ErrorResponse.class), + @ApiResponse( + code = 500, + message = "Internal Server Error. \n " + + "Server error occurred while retrieving the device details.", + response = ErrorResponse.class) + }) + Response deleteDeviceOrganizationById( + @ApiParam(value = "The organization ID of the device organization to delete.", required = true) + @PathParam("organizationId") int organizationId); + + /** + * Deletes records associated with a particular device ID from the device organization table. + * This method deletes records where the provided device ID matches either the deviceID column or + * parentDeviceID column in the device organization table. + * + * @param deviceId The ID of the device for which associations should be deleted. + * @return A response indicating the success or failure of the operation. + */ + @DELETE + @Path("associations/{deviceId}") + @ApiOperation( + httpMethod = "DELETE", + value = "Delete Device Associations", + notes = "This endpoint allows you to delete records associated with a particular device ID from the device organization table.", + tags = "Device Organization Management", + extensions = { + @Extension(properties = { + @ExtensionProperty(name = SCOPE, value = "dm:device-org:delete") + }) + } + ) + @ApiResponses( + value = { + @ApiResponse( + code = 200, + message = "OK. \n Successfully deleted device organizations.", + responseHeaders = { + @ResponseHeader( + name = "Content-Type", + description = "The content type of the body"), + @ResponseHeader( + name = "ETag", + description = "Entity Tag of the response resource.\n" + + "Used by caches, or in conditional requests."), + @ResponseHeader( + name = "Last-Modified", + description = "Date and time the resource was last modified.\n" + + "Used by caches, or in conditional requests."), + }), + @ApiResponse( + code = 304, + message = "Not Modified. Empty body because the client already has the latest version" + + " of the requested resource.\n"), + @ApiResponse( + code = 400, + message = "Bad Request. \n Invalid request or validation error.", + response = ErrorResponse.class), + @ApiResponse( + code = 404, + message = "Not Found. \n A deviceType with the specified device type was not found.", + response = ErrorResponse.class), + @ApiResponse( + code = 500, + message = "Internal Server Error. \n " + + "Server error occurred while retrieving the device details.", + response = ErrorResponse.class) + }) + Response deleteDeviceAssociations( + @ApiParam(name = "deviceId", value = "The ID of the device for which associations should be deleted.", required = true) + @PathParam("deviceId") int deviceId); + + +} diff --git a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization.api/src/main/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/api/DeviceOrganizationMgtServiceImpl.java b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization.api/src/main/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/api/DeviceOrganizationMgtServiceImpl.java new file mode 100644 index 0000000000..9a4b2590be --- /dev/null +++ b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization.api/src/main/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/api/DeviceOrganizationMgtServiceImpl.java @@ -0,0 +1,268 @@ +/* + * Copyright (c) 2018 - 2023, 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.device.mgt.extensions.device.organization.api; + +import com.google.gson.Gson; +import io.entgra.device.mgt.core.device.mgt.extensions.device.organization.api.beans.SuccessResponse; +import io.entgra.device.mgt.core.device.mgt.extensions.device.organization.api.util.DeviceOrgAPIUtils; +import io.entgra.device.mgt.core.device.mgt.extensions.device.organization.api.util.RequestValidationUtil; +import io.entgra.device.mgt.core.device.mgt.extensions.device.organization.dto.DeviceNodeResult; +import io.entgra.device.mgt.core.device.mgt.extensions.device.organization.dto.DeviceOrganization; +import io.entgra.device.mgt.core.device.mgt.extensions.device.organization.dto.PaginationRequest; +import io.entgra.device.mgt.core.device.mgt.extensions.device.organization.exception.DeviceOrganizationMgtPluginException; +import io.entgra.device.mgt.core.device.mgt.extensions.device.organization.spi.DeviceOrganizationService; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import javax.ws.rs.Consumes; +import javax.ws.rs.DELETE; +import javax.ws.rs.DefaultValue; +import javax.ws.rs.GET; +import javax.ws.rs.POST; +import javax.ws.rs.PUT; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.Produces; +import javax.ws.rs.QueryParam; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; +import java.util.List; + +@Path("/") +@Produces(MediaType.APPLICATION_JSON) +@Consumes(MediaType.APPLICATION_JSON) +public class DeviceOrganizationMgtServiceImpl implements DeviceOrganizationMgtService { + + private static final Log log = LogFactory.getLog(DeviceOrganizationMgtServiceImpl.class); + private static final Gson gson = new Gson(); + + @POST + @Override + public Response addDeviceOrganization(DeviceOrganization deviceOrganizationRequest) { + if (deviceOrganizationRequest == null) { + String errorMessage = "The payload of the device organization is incorrect."; + log.error(errorMessage); + return Response.status(Response.Status.BAD_REQUEST).entity(errorMessage).build(); + } + try { + if ( + deviceOrganizationRequest.getDeviceId() <= 0 || + !(deviceOrganizationRequest.getParentDeviceId() == null || + deviceOrganizationRequest.getParentDeviceId() >= 0) + ) { + String errorMessage = "The payload of the device organization is incorrect."; + return Response.status(Response.Status.BAD_REQUEST).entity(errorMessage).build(); + } + DeviceOrganizationService deviceOrganizationService = DeviceOrgAPIUtils.getDeviceOrganizationService(); + boolean resp = deviceOrganizationService.addDeviceOrganization(deviceOrganizationRequest); + SuccessResponse response = new SuccessResponse(); + response.setSuccess(resp); + return Response.status(Response.Status.CREATED).entity(response).build(); + } catch (DeviceOrganizationMgtPluginException e) { + String errorMessage = "device organization failed to be created"; + log.error(errorMessage); + return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(errorMessage).build(); + } + } + + @GET + @Override + @Path("children") + public Response getChildrenOfDeviceNode( + @QueryParam("deviceId") int deviceId, + @QueryParam("maxDepth") int maxDepth, + @QueryParam("includeDevice") boolean includeDevice) { + try { + DeviceOrganizationService deviceOrganizationService = DeviceOrgAPIUtils.getDeviceOrganizationService(); + DeviceNodeResult children = deviceOrganizationService.getChildrenOfDeviceNode(deviceId, maxDepth, includeDevice); + return Response.status(Response.Status.OK).entity(children).build(); + } catch (DeviceOrganizationMgtPluginException e) { + String errorMessage = "get Children of device node failed"; + log.error(errorMessage); + return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(errorMessage).build(); + } + } + + @GET + @Override + @Path("parents") + public Response getParentsOfDeviceNode( + @QueryParam("deviceId") int deviceId, + @QueryParam("maxDepth") int maxDepth, + @QueryParam("includeDevice") boolean includeDevice) { + try { + DeviceOrganizationService deviceOrganizationService = DeviceOrgAPIUtils.getDeviceOrganizationService(); + DeviceNodeResult parents = deviceOrganizationService.getParentsOfDeviceNode(deviceId, maxDepth, includeDevice); + return Response.status(Response.Status.OK).entity(parents).build(); + } catch (DeviceOrganizationMgtPluginException e) { + String errorMessage = "get Parent of device node failed"; + log.error(errorMessage); + return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(errorMessage).build(); + } + } + + @GET + @Override + @Path("leafs") + public Response getDeviceOrganizationLeafs( + @DefaultValue("0") @QueryParam("offset") int offset, + @DefaultValue("20") @QueryParam("limit") int limit) { + RequestValidationUtil.validatePaginationParameters(offset, limit); + try { + DeviceOrganizationService deviceOrganizationService = DeviceOrgAPIUtils.getDeviceOrganizationService(); + PaginationRequest request = new PaginationRequest(offset, limit); + List organizations = deviceOrganizationService.getDeviceOrganizationLeafs(request); + return Response.status(Response.Status.OK).entity(organizations).build(); + } catch (DeviceOrganizationMgtPluginException e) { + String errorMessage = "get leaf organizations failed"; + log.error(errorMessage); + return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(errorMessage).build(); + } + } + + @GET + @Path("roots") + @Override + public Response getDeviceOrganizationRoots( + @DefaultValue("0") @QueryParam("offset") int offset, + @DefaultValue("20") @QueryParam("limit") int limit) { + RequestValidationUtil.validatePaginationParameters(offset, limit); + try { + DeviceOrganizationService deviceOrganizationService = DeviceOrgAPIUtils.getDeviceOrganizationService(); + PaginationRequest request = new PaginationRequest(offset, limit); + List organizations = deviceOrganizationService.getDeviceOrganizationRoots(request); + return Response.status(Response.Status.OK).entity(organizations).build(); + } catch (DeviceOrganizationMgtPluginException e) { + String errorMessage = "get root organizations failed"; + log.error(errorMessage); + return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(errorMessage).build(); + } + } + + @GET + @Override + @Path("{organizationId}") + public Response getDeviceOrganizationById(@PathParam("organizationId") int organizationId) { + try { + DeviceOrganizationService deviceOrganizationService = DeviceOrgAPIUtils.getDeviceOrganizationService(); + DeviceOrganization organization = deviceOrganizationService.getDeviceOrganizationByID(organizationId); + return Response.status(Response.Status.OK).entity(organization).build(); + } catch (DeviceOrganizationMgtPluginException e) { + String errorMessage = "get organization by organization Id failed"; + log.error(errorMessage); + return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(errorMessage).build(); + } + } + + @GET + @Override + @Path("exists/{deviceId}/{parentDeviceId}") + public Response isDeviceOrganizationExist( + @PathParam("deviceId") int deviceId, + @PathParam("parentDeviceId") String parentDeviceId) { + try { + DeviceOrganizationService deviceOrganizationService = DeviceOrgAPIUtils.getDeviceOrganizationService(); + boolean exists; + if (parentDeviceId.equals("null")) { + exists = deviceOrganizationService.isDeviceOrganizationExist(deviceId, null); + } else { + exists = deviceOrganizationService.isDeviceOrganizationExist(deviceId, Integer.valueOf(parentDeviceId)); + } + SuccessResponse response = new SuccessResponse(); + response.setSuccess(exists); + return Response.status(Response.Status.OK).entity(response).build(); + } catch (DeviceOrganizationMgtPluginException e) { + String errorMessage = "organization existence check for device Id and parent device Id failed"; + log.error(errorMessage); + return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(e.getMessage()).build(); + } + } + + + @GET + @Override + @Path("organization/{deviceId}/{parentDeviceId}") + public Response getDeviceOrganizationByUniqueKey( + @PathParam("deviceId") int deviceId, + @PathParam("parentDeviceId") String parentDeviceId) { + try { + DeviceOrganizationService deviceOrganizationService = DeviceOrgAPIUtils.getDeviceOrganizationService(); + DeviceOrganization organization; + if (parentDeviceId.equals("null")) { + organization = deviceOrganizationService.getDeviceOrganizationByUniqueKey(deviceId, null); + } else { + organization = deviceOrganizationService.getDeviceOrganizationByUniqueKey(deviceId, Integer.valueOf(parentDeviceId)); + } + return Response.status(Response.Status.OK).entity(organization).build(); + } catch (DeviceOrganizationMgtPluginException e) { + String errorMessage = "organization get for device Id and parent device Id failed"; + log.error(errorMessage); + return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(errorMessage).build(); + } + } + + @PUT + @Override + public Response updateDeviceOrganization(DeviceOrganization deviceOrganization) { + try { + DeviceOrganizationService deviceOrganizationService = DeviceOrgAPIUtils.getDeviceOrganizationService(); + boolean resp = deviceOrganizationService.updateDeviceOrganization(deviceOrganization); + SuccessResponse response = new SuccessResponse(); + response.setSuccess(resp); + return Response.status(Response.Status.OK).entity(response).build(); + } catch (DeviceOrganizationMgtPluginException e) { + String errorMessage = "update organization failed"; + log.error(errorMessage); + return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(errorMessage).build(); + } + } + + @DELETE + @Override + @Path("{organizationId}") + public Response deleteDeviceOrganizationById(@PathParam("organizationId") int organizationId) { + try { + DeviceOrganizationService deviceOrganizationService = DeviceOrgAPIUtils.getDeviceOrganizationService(); + boolean resp = deviceOrganizationService.deleteDeviceOrganizationByID(organizationId); + SuccessResponse response = new SuccessResponse(); + response.setSuccess(resp); + return Response.status(Response.Status.OK).entity(response).build(); + } catch (DeviceOrganizationMgtPluginException e) { + String errorMessage = "delete organization by organization Id failed"; + log.error(errorMessage); + return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(errorMessage).build(); + } + } + + @DELETE + @Override + @Path("associations/{deviceId}") + public Response deleteDeviceAssociations(@PathParam("deviceId") int deviceId) { + try { + DeviceOrganizationService deviceOrganizationService = DeviceOrgAPIUtils.getDeviceOrganizationService(); + boolean resp = deviceOrganizationService.deleteDeviceAssociations(deviceId); + SuccessResponse response = new SuccessResponse(); + response.setSuccess(resp); + return Response.status(Response.Status.OK).entity(response).build(); + } catch (DeviceOrganizationMgtPluginException e) { + String errorMessage = "delete organizations associated with a device Id failed"; + log.error(errorMessage); + return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(errorMessage).build(); + } + } +} diff --git a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization.api/src/main/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/api/beans/ErrorListItem.java b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization.api/src/main/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/api/beans/ErrorListItem.java new file mode 100644 index 0000000000..9c0bbd8fad --- /dev/null +++ b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization.api/src/main/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/api/beans/ErrorListItem.java @@ -0,0 +1,78 @@ +/* + * Copyright (c) 2018 - 2023, 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.device.mgt.extensions.device.organization.api.beans; + +import com.fasterxml.jackson.annotation.JsonProperty; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +import javax.validation.constraints.NotNull; + +@ApiModel(description = "Error List Item") +public class ErrorListItem { + + @NotNull + private String code = null; + @NotNull + private String message = null; + + @ApiModelProperty(required = true, value = "") + @JsonProperty("code") + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public ErrorListItem() { + } + + public ErrorListItem(String code, String msg) { + this.code = code; + this.message = msg; + } + + + /** + * Description about individual errors occurred + */ + @ApiModelProperty(required = true, value = "Description about individual errors occurred") + @JsonProperty("message") + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("errorItem {\n"); + + sb.append(" code: ").append(code).append("\n"); + sb.append(" message: ").append(message).append("\n"); + sb.append("}\n"); + return sb.toString(); + } + +} diff --git a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization.api/src/main/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/api/beans/ErrorResponse.java b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization.api/src/main/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/api/beans/ErrorResponse.java new file mode 100644 index 0000000000..c3769f5803 --- /dev/null +++ b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization.api/src/main/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/api/beans/ErrorResponse.java @@ -0,0 +1,193 @@ +/* + * Copyright (c) 2018 - 2023, 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.device.mgt.extensions.device.organization.api.beans; + + +import com.fasterxml.jackson.annotation.JsonProperty; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +import java.util.ArrayList; +import java.util.List; + +@ApiModel(description = "Error Response") +public class ErrorResponse { + + private Long code = null; + private String message = null; + private String description = null; + private String moreInfo = null; + private List errorItems = new ArrayList<>(); + + private ErrorResponse() { + } + + @JsonProperty(value = "code") + @ApiModelProperty(required = true, value = "") + public Long getCode() { + return code; + } + + public void setCode(Long code) { + this.code = code; + } + + @JsonProperty(value = "message") + @ApiModelProperty(required = true, value = "ErrorResponse message.") + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + @JsonProperty(value = "description") + @ApiModelProperty(value = "A detail description about the error message.") + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + @JsonProperty(value = "moreInfo") + @ApiModelProperty(value = "Preferably an url with more details about the error.") + public String getMoreInfo() { + return moreInfo; + } + + public void setMoreInfo(String moreInfo) { + this.moreInfo = moreInfo; + } + + public void addErrorListItem(ErrorListItem item) { + this.errorItems.add(item); + } + + /** + * If there are more than one error list them out. \nFor example, list out validation errors by each field. + */ + @JsonProperty(value = "errorItems") + @ApiModelProperty(value = "If there are more than one error list them out. \n" + + "For example, list out validation errors by each field.") + public List getErrorItems() { + return errorItems; + } + + public void setErrorItems(List error) { + this.errorItems = error; + } + + @Override + public String toString() { +// StringBuilder sb = new StringBuilder(); +// sb.append("{"); +// boolean cont = false; +// if (code != null) { +// cont = true; +// sb.append(" \"code\": ").append(code); +// } +// if (message != null) { +// if (cont) { +// sb.append(","); +// } +// cont = true; +// sb.append(" \"message\": \"").append(message).append("\""); +// } +// if (description != null) { +// if (cont) { +// sb.append(","); +// } +// cont = true; +// sb.append(" \"description\": ").append(description).append("\""); +// } +// if (moreInfo != null) { +// if (cont) { +// sb.append(","); +// } +// cont = true; +// sb.append(" \"moreInfo\": \"").append(moreInfo).append("\""); +// } +// if (error != null && error.size() > 0) { +// if (cont) { +// sb.append(","); +// } +// sb.append(" \"errorItems\": ").append(error); +// } +// sb.append("}"); +// return sb.toString(); + return null; + } + + public static class ErrorResponseBuilder { + + private Long code = null; + private String message = null; + private String description = null; + private String moreInfo = null; + private List error; + + + public ErrorResponseBuilder() { + this.error = new ArrayList<>(); + } + + public ErrorResponseBuilder setCode(long code) { + this.code = code; + return this; + } + + public ErrorResponseBuilder setMessage(String message) { + this.message = message; + return this; + } + + public ErrorResponseBuilder setDescription(String description) { + this.description = description; + return this; + } + + public ErrorResponseBuilder setMoreInfo(String moreInfo) { + this.moreInfo = moreInfo; + return this; + } + + public ErrorResponseBuilder addErrorItem(String code, String msg) { + ErrorListItem item = new ErrorListItem(); + item.setCode(code); + item.setMessage(msg); + this.error.add(item); + return this; + } + + public ErrorResponse build() { + ErrorResponse errorResponse = new ErrorResponse(); + errorResponse.setCode(code); + errorResponse.setMessage(message); + errorResponse.setErrorItems(error); + errorResponse.setDescription(description); + errorResponse.setMoreInfo(moreInfo); + return errorResponse; + } + } + +} + + diff --git a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization.api/src/main/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/api/beans/GsonMessageBodyHandler.java b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization.api/src/main/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/api/beans/GsonMessageBodyHandler.java new file mode 100644 index 0000000000..cd0ee361e7 --- /dev/null +++ b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization.api/src/main/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/api/beans/GsonMessageBodyHandler.java @@ -0,0 +1,97 @@ +/* + * Copyright (c) 2018 - 2023, 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.device.mgt.extensions.device.organization.api.beans; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; + +import javax.ws.rs.Consumes; +import javax.ws.rs.Produces; +import javax.ws.rs.WebApplicationException; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.MultivaluedMap; +import javax.ws.rs.ext.MessageBodyReader; +import javax.ws.rs.ext.MessageBodyWriter; +import javax.ws.rs.ext.Provider; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.io.OutputStreamWriter; +import java.lang.annotation.Annotation; +import java.lang.reflect.Type; +import java.nio.charset.StandardCharsets; + +import static javax.ws.rs.core.MediaType.APPLICATION_JSON; + +@Provider +@Produces(APPLICATION_JSON) +@Consumes(APPLICATION_JSON) +public class GsonMessageBodyHandler implements MessageBodyWriter, MessageBodyReader { + + public static final String DATE_FORMAT = "EEE, d MMM yyyy HH:mm:ss Z"; + private Gson gson; + + public boolean isReadable(Class aClass, Type type, Annotation[] annotations, MediaType mediaType) { + return true; + } + + private Gson getGson() { + if (gson == null) { + final GsonBuilder gsonBuilder = new GsonBuilder(); + gson = gsonBuilder.setDateFormat(DATE_FORMAT).create(); + } + return gson; + } + + public Object readFrom(Class objectClass, Type type, Annotation[] annotations, + MediaType mediaType, MultivaluedMap stringStringMultivaluedMap, + InputStream entityStream) + throws IOException, WebApplicationException { + + InputStreamReader reader = new InputStreamReader(entityStream, StandardCharsets.UTF_8); + + try { + return getGson().fromJson(reader, type); + } finally { + reader.close(); + } + } + + public boolean isWriteable(Class aClass, Type type, Annotation[] annotations, MediaType mediaType) { + return true; + } + + public long getSize(Object o, Class aClass, Type type, Annotation[] annotations, MediaType mediaType) { + return -1; + } + + public void writeTo(Object object, Class aClass, Type type, Annotation[] annotations, + MediaType mediaType, MultivaluedMap stringObjectMultivaluedMap, + OutputStream entityStream) + throws IOException, WebApplicationException { + + OutputStreamWriter writer = new OutputStreamWriter(entityStream, StandardCharsets.UTF_8); + try { + getGson().toJson(object, type, writer); + } finally { + writer.close(); + } + } +} diff --git a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization.api/src/main/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/api/beans/SuccessResponse.java b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization.api/src/main/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/api/beans/SuccessResponse.java new file mode 100644 index 0000000000..1d420da922 --- /dev/null +++ b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization.api/src/main/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/api/beans/SuccessResponse.java @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2018 - 2023, 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.device.mgt.extensions.device.organization.api.beans; + +public class SuccessResponse { + + private boolean isSuccess; + + public boolean isSuccess() { + return isSuccess; + } + + public void setSuccess(boolean success) { + isSuccess = success; + } +} diff --git a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization.api/src/main/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/api/beans/ValidationInterceptor.java b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization.api/src/main/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/api/beans/ValidationInterceptor.java new file mode 100644 index 0000000000..ce98d50ee7 --- /dev/null +++ b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization.api/src/main/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/api/beans/ValidationInterceptor.java @@ -0,0 +1,124 @@ +/* + * Copyright (c) 2018 - 2023, 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.device.mgt.extensions.device.organization.api.beans; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.cxf.interceptor.Fault; +import org.apache.cxf.jaxrs.lifecycle.ResourceProvider; +import org.apache.cxf.jaxrs.model.ClassResourceInfo; +import org.apache.cxf.jaxrs.model.OperationResourceInfo; +import org.apache.cxf.message.Message; +import org.apache.cxf.message.MessageContentsList; +import org.apache.cxf.phase.AbstractPhaseInterceptor; +import org.apache.cxf.phase.Phase; + +import javax.validation.ConstraintViolation; +import javax.validation.ConstraintViolationException; +import javax.validation.Validation; +import javax.validation.Validator; +import javax.validation.ValidatorFactory; +import javax.validation.executable.ExecutableValidator; +import java.lang.reflect.Method; +import java.util.List; +import java.util.Set; + +public class ValidationInterceptor extends AbstractPhaseInterceptor { + private Log log = LogFactory.getLog(getClass()); + private Validator validator = null; //validator interface is thread-safe + + public ValidationInterceptor() { + super(Phase.PRE_INVOKE); + ValidatorFactory defaultFactory = Validation.buildDefaultValidatorFactory(); + validator = defaultFactory.getValidator(); + if (validator == null) { + log.warn("Bean Validation provider could not be found, no validation will be performed"); + } else { + if (log.isDebugEnabled()) { + log.debug("Validation In-Interceptor initialized successfully"); + } + } + } + + @Override + public void handleMessage(Message message) throws Fault { + final OperationResourceInfo operationResource = message.getExchange().get(OperationResourceInfo.class); + if (operationResource == null) { + log.info("OperationResourceInfo is not available, skipping validation"); + return; + } + + final ClassResourceInfo classResource = operationResource.getClassResourceInfo(); + if (classResource == null) { + log.info("ClassResourceInfo is not available, skipping validation"); + return; + } + + final ResourceProvider resourceProvider = classResource.getResourceProvider(); + if (resourceProvider == null) { + log.info("ResourceProvider is not available, skipping validation"); + return; + } + + final List arguments = MessageContentsList.getContentsList(message); + final Method method = operationResource.getAnnotatedMethod(); + final Object instance = resourceProvider.getInstance(message); + if (method != null && arguments != null) { + //validate the parameters(arguments) over the invoked method + validate(method, arguments.toArray(), instance); + + //validate the fields of each argument + for (Object arg : arguments) { + if (arg != null) + validate(arg); + } + } + + } + + public void validate(final Method method, final Object[] arguments, final T instance) { + if (validator == null) { + log.warn("Bean Validation provider could not be found, no validation will be performed"); + return; + } + + ExecutableValidator methodValidator = validator.forExecutables(); + Set> violations = methodValidator.validateParameters(instance, + method, arguments); + + if (!violations.isEmpty()) { + throw new ConstraintViolationException(violations); + } + } + + public void validate(final T object) { + if (validator == null) { + log.warn("Bean Validation provider could be found, no validation will be performed"); + return; + } + + Set> violations = validator.validate(object); + + if (!violations.isEmpty()) { + throw new ConstraintViolationException(violations); + } + } + + public void handleFault(org.apache.cxf.message.Message messageParam) { + } +} diff --git a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization.api/src/main/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/api/util/DeviceOrgAPIUtils.java b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization.api/src/main/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/api/util/DeviceOrgAPIUtils.java new file mode 100644 index 0000000000..34cf83bf67 --- /dev/null +++ b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization.api/src/main/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/api/util/DeviceOrgAPIUtils.java @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2018 - 2023, 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.device.mgt.extensions.device.organization.api.util; + + +import io.entgra.device.mgt.core.device.mgt.extensions.device.organization.spi.DeviceOrganizationService; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.wso2.carbon.context.PrivilegedCarbonContext; + +/** + * DeviceOrgAPIUtils class provides utility function used by Device Organization REST - API classes. + */ +public class DeviceOrgAPIUtils { + private static DeviceOrganizationService deviceOrganizationService; + + private static final Log log = LogFactory.getLog(DeviceOrgAPIUtils.class); + + /** + * Initializing and accessing method for DeviceOrganizationService. + * + * @return DeviceOrganizationService instance + * @throws IllegalStateException if deviceOrganizationService cannot be initialized + */ + public static DeviceOrganizationService getDeviceOrganizationService() { + if (deviceOrganizationService == null) { + synchronized (DeviceOrgAPIUtils.class) { + if (deviceOrganizationService == null) { + PrivilegedCarbonContext ctx = PrivilegedCarbonContext.getThreadLocalCarbonContext(); + deviceOrganizationService = (DeviceOrganizationService) ctx.getOSGiService( + DeviceOrganizationService.class, null); + if (deviceOrganizationService == null) { + throw new IllegalStateException("Device Organization Management service not initialized."); + } + } + } + } + return deviceOrganizationService; + } + + +} diff --git a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization.api/src/main/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/api/util/DeviceOrgConstants.java b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization.api/src/main/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/api/util/DeviceOrgConstants.java new file mode 100644 index 0000000000..7772e613bf --- /dev/null +++ b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization.api/src/main/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/api/util/DeviceOrgConstants.java @@ -0,0 +1,6 @@ +package io.entgra.device.mgt.core.device.mgt.extensions.device.organization.api.util; + +public class DeviceOrgConstants { + + public static final String SCOPE = "scope"; +} diff --git a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization.api/src/main/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/api/util/InputValidationException.java b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization.api/src/main/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/api/util/InputValidationException.java new file mode 100644 index 0000000000..8ff580870f --- /dev/null +++ b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization.api/src/main/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/api/util/InputValidationException.java @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2018 - 2023, 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.device.mgt.extensions.device.organization.api.util; + +import io.entgra.device.mgt.core.device.mgt.extensions.device.organization.api.beans.ErrorResponse; + +import javax.ws.rs.BadRequestException; +import javax.ws.rs.core.Response; +import java.io.Serializable; + +public class InputValidationException extends BadRequestException implements Serializable { + + private static final long serialVersionUID = 147843579458906890L; + + public InputValidationException(ErrorResponse error) { + super(Response.status(Response.Status.BAD_REQUEST).entity(error).build()); + } +} diff --git a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization.api/src/main/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/api/util/RequestValidationUtil.java b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization.api/src/main/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/api/util/RequestValidationUtil.java new file mode 100644 index 0000000000..664341ed9f --- /dev/null +++ b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization.api/src/main/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/api/util/RequestValidationUtil.java @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2018 - 2023, 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.device.mgt.extensions.device.organization.api.util; + +import io.entgra.device.mgt.core.device.mgt.extensions.device.organization.api.beans.ErrorResponse; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +public class RequestValidationUtil { + + private static final Log log = LogFactory.getLog(RequestValidationUtil.class); + + public static void validatePaginationParameters(int offset, int limit) { + if (offset < 0) { + throw new InputValidationException( + new ErrorResponse.ErrorResponseBuilder().setCode(400l).setMessage("Request parameter offset is s " + + "negative value.").build()); + } + if (limit < 0) { + throw new InputValidationException( + new ErrorResponse.ErrorResponseBuilder().setCode(400l).setMessage("Request parameter limit is a " + + "negative value.").build()); + } + if (limit > 100) { + throw new InputValidationException( + new ErrorResponse.ErrorResponseBuilder().setCode(400l).setMessage("Request parameter limit should" + + " be less than or equal to 100.").build()); + } + + } +} diff --git a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization.api/src/main/webapp/META-INF/webapp-classloading.xml b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization.api/src/main/webapp/META-INF/webapp-classloading.xml new file mode 100644 index 0000000000..705c89edc9 --- /dev/null +++ b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization.api/src/main/webapp/META-INF/webapp-classloading.xml @@ -0,0 +1,35 @@ + + + + + + + + + false + + + CXF3,Carbon + diff --git a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization.api/src/main/webapp/WEB-INF/cxf-servlet.xml b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization.api/src/main/webapp/WEB-INF/cxf-servlet.xml new file mode 100644 index 0000000000..033daa08ae --- /dev/null +++ b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization.api/src/main/webapp/WEB-INF/cxf-servlet.xml @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization.api/src/main/webapp/WEB-INF/web.xml b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization.api/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 0000000000..d5b560d7e7 --- /dev/null +++ b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization.api/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,119 @@ + + + + Device-Organization-Webapp + + JAX-WS/JAX-RS Device Organization Endpoint + JAX-WS/JAX-RS Servlet + CXFServlet + + org.apache.cxf.transport.servlet.CXFServlet + + + + swagger.security.filter + ApiAuthorizationFilterImpl + + 1 + + + CXFServlet + /* + + + 60 + + + + doAuthentication + true + + + + + managed-api-enabled + true + + + + + + + isSharedWithAllTenants + true + + + + + + + + + + + + + + + ApiOriginFilter + io.entgra.device.mgt.core.device.mgt.extensions.device.organization.api.ApiOriginFilter + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ApiOriginFilter + /* + + + 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 new file mode 100644 index 0000000000..77aa526c4e --- /dev/null +++ b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/pom.xml @@ -0,0 +1,416 @@ + + + + + + + device-mgt-extensions + io.entgra.device.mgt.core + 5.0.40-SNAPSHOT + ../pom.xml + + + 4.0.0 + io.entgra.device.mgt.core.device.mgt.extensions.device.organization + bundle + Entgra IoT - Device Organization Module + Entgra IoT - Device Organization Module Implementation + http://entgra.io + + + io.entgra.device.mgt.core + io.entgra.device.mgt.core.device.mgt.common + provided + + + org.wso2.carbon.identity.inbound.auth.oauth2 + org.wso2.carbon.identity.oauth.stub + + + org.apache.axis2.wso2 + axis2-client + + + org.apache.geronimo.specs.wso2 + geronimo-stax-api_1.0_spec + + + org.apache.ws.commons.axiom.wso2 + axiom + + + org.codehaus.woodstox + woodstox-core-asl + + + org.codehaus.woodstox + wstx-asl + + + + + + + org.wso2.carbon.analytics + org.wso2.carbon.analytics.api + + + + + io.entgra.device.mgt.core + io.entgra.device.mgt.core.device.mgt.extensions + provided + + + org.codehaus.woodstox + stax2-api + + + org.codehaus.woodstox + woodstox-core-asl + + + org.wso2.carbon + org.wso2.carbon.securevault + + + org.apache.ws.commons.axiom.wso2 + axiom + + + + + org.wso2.carbon + org.wso2.carbon.ndatasource.core + provided + + + org.wso2.securevault + org.wso2.securevault + + + + + org.wso2.carbon + org.wso2.carbon.base + provided + + + org.wso2.securevault + org.wso2.securevault + + + org.apache.ws.commons.axiom.wso2 + axiom + + + org.mockito + mockito-core + + + + + org.eclipse.osgi + org.eclipse.osgi + provided + + + org.eclipse.osgi + org.eclipse.osgi.services + provided + + + + + + + + + + + + + org.wso2.carbon + org.wso2.carbon.utils + provided + + + io.entgra.device.mgt.core + io.entgra.device.mgt.core.device.mgt.core + provided + + + org.wso2.carbon + org.wso2.carbon.registry.api + provided + + + org.wso2.carbon + org.wso2.carbon.registry.core + provided + + + org.apache.tomcat.wso2 + jdbc-pool + provided + + + com.google.code.gson + gson + provided + + + io.github.openfeign + feign-core + provided + + + io.github.openfeign + feign-jackson + provided + + + io.github.openfeign + feign-jaxrs + provided + + + io.github.openfeign + feign-gson + provided + + + io.github.openfeign + feign-okhttp + provided + + + io.github.openfeign + feign-slf4j + provided + + + io.entgra.device.mgt.core + io.entgra.device.mgt.core.identity.jwt.client.extension + provided + + + commons-validator + commons-validator + provided + + + org.apache.cxf + cxf-rt-frontend-jaxws + provided + + + org.apache.cxf + cxf-rt-frontend-jaxrs + provided + + + org.apache.cxf + cxf-rt-transports-http + provided + + + commons-lang.wso2 + commons-lang + provided + + + com.google.guava + guava + ${guava.version} + provided + + + org.json + json + ${json.version} + provided + + + com.fasterxml.jackson.core + jackson-databind + ${fasterxml.jackson.version} + provided + + + org.powermock + powermock-module-testng + test + + + org.powermock + powermock-api-mockito + test + + + org.testng + testng + test + + + org.wso2.orbit.com.h2database + h2 + test + + + org.apache.httpcomponents.wso2 + httpcore + test + + + org.wso2.apache.httpcomponents + httpclient + test + + + org.wso2.securevault + org.wso2.securevault + test + + + xerces.wso2 + xercesImpl + test + + + org.apache.axis2.wso2 + axis2 + test + + + org.wso2.carbon + org.wso2.carbon.queuing + test + + + javax.xml.bind + jaxb-api + test + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + + org.apache.felix + maven-scr-plugin + + + org.apache.felix + maven-bundle-plugin + true + + + ${project.artifactId} + ${project.artifactId} + ${io.entgra.device.mgt.core.version} + IoT Device Management Device Organization Bundle + + !io.entgra.device.mgt.core.device.mgt.extensions.device.organization.internal, + io.entgra.device.mgt.core.device.mgt.extensions.device.organization.* + + io.entgra.device.mgt.core.device.mgt.extensions.device.organization.internal + + org.osgi.framework.*;version="${imp.package.version.osgi.framework}", + org.osgi.service.*;version="${imp.package.version.osgi.service}", + org.apache.commons.logging, + org.apache.commons.lang, + javax.xml, + javax.xml.stream, + javax.xml.bind.*, + javax.sql, + javax.xml.parsers; version=0.0.0, + org.w3c.dom, + javax.naming, + org.wso2.carbon.context, + org.wso2.carbon.base, + org.wso2.carbon.utils.*, + io.entgra.device.mgt.core.device.mgt.common.*, + io.entgra.device.mgt.core.device.mgt.core.*, + org.wso2.carbon.ndatasource.core, + org.wso2.carbon.registry.core, + org.wso2.carbon.registry.core.session, + org.wso2.carbon.registry.core.service, + org.wso2.carbon.registry.api, + io.entgra.device.mgt.core.device.mgt.extensions.license.mgt.registry, + javax.net.ssl, + org.wso2.carbon.core.util, + okhttp3, + org.json.*, + com.google.gson.*, + com.fasterxml.jackson.core.*, + com.fasterxml.jackson.databind.*, + com.fasterxml.jackson.annotation.*, + com.google.common.cache.*, + + + + + + + + + + + + + + + + + + + org.jacoco + jacoco-maven-plugin + + ${basedir}/target/coverage-reports/jacoco-unit.exec + + + + jacoco-initialize + + prepare-agent + + + + jacoco-site + test + + report + + + ${basedir}/target/coverage-reports/jacoco-unit.exec + ${basedir}/target/coverage-reports/site + + + + + + + + diff --git a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/main/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/dao/DeviceOrganizationDAO.java b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/main/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/dao/DeviceOrganizationDAO.java new file mode 100644 index 0000000000..084585676b --- /dev/null +++ b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/main/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/dao/DeviceOrganizationDAO.java @@ -0,0 +1,209 @@ +/* + * Copyright (c) 2018 - 2023, 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.device.mgt.extensions.device.organization.dao; + +import io.entgra.device.mgt.core.device.mgt.extensions.device.organization.dto.DeviceNodeResult; +import io.entgra.device.mgt.core.device.mgt.extensions.device.organization.dto.DeviceOrganization; +import io.entgra.device.mgt.core.device.mgt.extensions.device.organization.dto.PaginationRequest; +import io.entgra.device.mgt.core.device.mgt.extensions.device.organization.exception.DeviceOrganizationMgtDAOException; +import io.entgra.device.mgt.core.device.mgt.extensions.device.organization.dto.AdditionResult; + +import java.util.List; + +/** + * This is responsible for DeviceOrganization related DAO operations. + */ +public interface DeviceOrganizationDAO { + + /** + * Retrieves child devices per particular device ID + * + * @param deviceId The device ID for which child devices are retrieved. + * @param maxDepth The maximum depth to traverse when fetching child devices. + * @param includeDevice Flag to indicate whether to include the parent device in the result. + * @param tenantID The ID of the tenant. + * @return A list of child device nodes. + * @throws DeviceOrganizationMgtDAOException If an error occurs while retrieving child devices. + */ + DeviceNodeResult getChildrenOfDeviceNode(int deviceId, int maxDepth, boolean includeDevice, int tenantID) throws DeviceOrganizationMgtDAOException; + + /** + * Retrieves parent devices for a given device node. + * + * @param deviceId The device ID for which parent devices are retrieved. + * @param maxDepth The maximum depth to traverse when fetching parent devices. + * @param includeDevice Flag to indicate whether to include the current device node in the result. + * @param tenantID The ID of the tenant. + * @return A list of parent device nodes. + * @throws DeviceOrganizationMgtDAOException If an error occurs while retrieving parent devices. + */ + DeviceNodeResult getParentsOfDeviceNode(int deviceId, int maxDepth, boolean includeDevice, int tenantID) throws DeviceOrganizationMgtDAOException; + + /** + * Retrieves all device organization records. + * + * @return A list of device organization records. + * @throws DeviceOrganizationMgtDAOException If an error occurs while retrieving device organization records. + */ + List getAllDeviceOrganizations() throws DeviceOrganizationMgtDAOException; + + /** + * Retrieves device Organization Roots + * + * @return A list of root device organization records. + * @throws DeviceOrganizationMgtDAOException + */ + public List getDeviceOrganizationRoots(PaginationRequest request, int tenantID) throws DeviceOrganizationMgtDAOException; + + /** + * Retrieves device Organization Leafs + * + * @return A list of leaf device organization records. + * @throws DeviceOrganizationMgtDAOException + */ + public List getDeviceOrganizationLeafs(PaginationRequest request, int tenantID) throws DeviceOrganizationMgtDAOException; + + /** + * Adds a new record to the device organization table. + * + * @param deviceOrganization The device organization to be added. + * @return True if the device organization is successfully added, false otherwise. + * @throws DeviceOrganizationMgtDAOException If an error occurs while adding the device organization record. + */ + AdditionResult addDeviceOrganization(DeviceOrganization deviceOrganization) throws DeviceOrganizationMgtDAOException; + + /** + * Checks whether a record already exists with the same deviceId and parentDeviceId. + * + * @param deviceId The ID of the device. + * @param parentDeviceId The ID of the parent device. + * @param tenantID The ID of the tenant. + * @return True if a record with the specified deviceId and parentDeviceId exists, false otherwise. + * @throws DeviceOrganizationMgtDAOException If an error occurs while checking the existence of the record. + */ + boolean isDeviceOrganizationExist(int deviceId, Integer parentDeviceId, int tenantID) throws DeviceOrganizationMgtDAOException; + +// /** +// * Check whether there is a cyclic relationship upon creation of new organization +// * @param deviceID The ID of the target device. +// * @param parentDeviceID The ID of the source device. +// * @param tenantID The ID of the tenant. +// * @return True if a cyclic relationship get created. +// * @throws DeviceOrganizationMgtDAOException +// */ +// boolean isCyclicRelationshipExist(int deviceID, Integer parentDeviceID, int tenantID) +// throws DeviceOrganizationMgtDAOException; + + /** + * Get a device organization by the CHILD_PARENT_COMP_KEY unique key. + * + * @param deviceId The ID of the child device. + * @param parentDeviceId The ID of the parent device. + * @param tenantID The ID of the tenant. + * @return The DeviceOrganization object if found, null otherwise. + * @throws DeviceOrganizationMgtDAOException if an error occurs while accessing the database. + */ + DeviceOrganization getDeviceOrganizationByUniqueKey(int deviceId, Integer parentDeviceId, int tenantID) + throws DeviceOrganizationMgtDAOException; + + /** + * Updates a record in the device organization table with the provided information. + * + * @param deviceOrganization The DeviceOrganization object containing the updated information. + * @return True if the record was successfully updated, false otherwise. + * @throws DeviceOrganizationMgtDAOException If an error occurs while updating the record. + */ + boolean updateDeviceOrganization(DeviceOrganization deviceOrganization) + throws DeviceOrganizationMgtDAOException; + + /** + * Retrieves a device organization record from the database based on the provided organization ID. + * + * @param organizationId The unique identifier of the device organization record to retrieve. + * @param tenantID The ID of the tenant. + * @return The DeviceOrganization object representing the retrieved organization, or null if not found. + * @throws DeviceOrganizationMgtDAOException If an error occurs while retrieving the organization record. + */ + DeviceOrganization getDeviceOrganizationByID(int organizationId, int tenantID) throws DeviceOrganizationMgtDAOException; + + /** + * Deletes a device organization record from the database based on the provided device ID and parent Device ID. + * @param deviceId + * @param parentDeviceId + * @param tenantID + * @return true if the organization record was successfully deleted, false otherwise. + * @throws DeviceOrganizationMgtDAOException + */ + boolean deleteDeviceOrganizationByUniqueKey(int deviceId, Integer parentDeviceId, int tenantID) throws DeviceOrganizationMgtDAOException; + + /** + * Deletes a device organization record from the database based on the provided organization ID. + * + * @param organizationId The unique identifier of the device organization record to delete. + * @param tenantID The ID of the tenant. + * @return true if the organization record was successfully deleted, false otherwise. + * @throws DeviceOrganizationMgtDAOException If an error occurs while deleting the organization record. + */ + boolean deleteDeviceOrganizationByID(int organizationId, int tenantID) throws DeviceOrganizationMgtDAOException; + + /** + * Deletes records associated with a particular device ID from the device organization table. + * This method deletes records where the provided device ID matches either the deviceID column or + * parentDeviceID column in the device organization table. + * + * @param deviceId The unique identifier of the device for which associated records should be deleted. + * @param tenantID The ID of the tenant. + * @return true if associated records were successfully deleted, false otherwise. + * @throws DeviceOrganizationMgtDAOException If an error occurs while deleting the associated records. + */ + boolean deleteDeviceAssociations(int deviceId, int tenantID) throws DeviceOrganizationMgtDAOException; + + /** + * Checks whether a record with the specified device ID exists either in the deviceID column or + * parentDeviceID column in the device organization table. + * + * @param deviceId The unique identifier of the device to check for existence. + * @param tenantID The ID of the tenant. + * @return true if a record with the given device ID exists, false otherwise. + * @throws DeviceOrganizationMgtDAOException If an error occurs while querying the database. + */ + boolean isDeviceIdExist(int deviceId, int tenantID) throws DeviceOrganizationMgtDAOException; + + /** + * Checks if a child device with the given `deviceId` exists in the database. + * + * @param deviceId The ID of the child device to check. + * @param tenantID The ID of the tenant. + * @return `true` if the child device exists, `false` otherwise. + * @throws DeviceOrganizationMgtDAOException If an error occurs while checking the existence. + */ + boolean isChildDeviceIdExist(int deviceId, int tenantID) throws DeviceOrganizationMgtDAOException; + + /** + * This method is only used for testing + * @param tenantID + * @throws DeviceOrganizationMgtDAOException + */ + void addAllDevices(int tenantID) throws DeviceOrganizationMgtDAOException; + + /** + * This method is only used for testing + * @throws DeviceOrganizationMgtDAOException + */ + void addOrganizations(int tenantID, int start, int end) throws DeviceOrganizationMgtDAOException; +} diff --git a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/main/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/dao/DeviceOrganizationDAOFactory.java b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/main/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/dao/DeviceOrganizationDAOFactory.java new file mode 100644 index 0000000000..bfbd665d49 --- /dev/null +++ b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/main/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/dao/DeviceOrganizationDAOFactory.java @@ -0,0 +1,85 @@ +/* + * Copyright (c) 2018 - 2023, 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.device.mgt.extensions.device.organization.dao; + +import io.entgra.device.mgt.core.device.mgt.core.config.datasource.DataSourceConfig; +import io.entgra.device.mgt.core.device.mgt.extensions.device.organization.dao.impl.DeviceOrganizationDAOImpl; +import io.entgra.device.mgt.core.device.mgt.extensions.device.organization.dao.impl.DeviceOrganizationMysqlDAOImpl; +import io.entgra.device.mgt.core.device.mgt.extensions.device.organization.dao.util.ConnectionManagerUtil; +import io.entgra.device.mgt.core.device.mgt.extensions.device.organization.exception.UnsupportedDatabaseEngineException; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +/** + * This class intends to act as the primary entity that hides all DAO instantiation related complexities and logic so + * that the business objection handling layer doesn't need to be aware of the same providing seamless plug-ability of + * different data sources, connection acquisition mechanisms as well as different forms of DAO implementations to the + * high-level implementations that require Device Organization related metadata persistence. + */ +public class DeviceOrganizationDAOFactory { + private static final Log log = LogFactory.getLog(DeviceOrganizationDAOFactory.class); + private static String databaseEngine; + + /** + * Initialize the Device Organization Data Source. + * + * @param dataSourceConfiguration The DataSourceConfig containing data source information. + */ + public static void init(DataSourceConfig dataSourceConfiguration) { + if (log.isDebugEnabled()) { + log.debug("Initializing Device Organization Data Source"); + } + ConnectionManagerUtil.resolveDataSource(dataSourceConfiguration); + databaseEngine = ConnectionManagerUtil.getDatabaseType(); + } + + public static final class DataBaseTypes { + private DataBaseTypes() { + } + + public static final String DB_TYPE_MYSQL = "MySQL"; + public static final String DB_TYPE_ORACLE = "Oracle"; + public static final String DB_TYPE_MSSQL = "Microsoft SQL Server"; + public static final String DB_TYPE_H2 = "H2"; + public static final String DB_TYPE_POSTGRESQL = "PostgreSQL"; + } + + /** + * Retrieves a DeviceOrganizationDAO implementation based on the configured database engine. + * + * @return a DeviceOrganizationDAO implementation + */ + public static DeviceOrganizationDAO getDeviceOrganizationDAO() { + if (databaseEngine != null) { + switch (databaseEngine) { + case DataBaseTypes.DB_TYPE_H2: + case DataBaseTypes.DB_TYPE_POSTGRESQL: + case DataBaseTypes.DB_TYPE_MSSQL: + case DataBaseTypes.DB_TYPE_ORACLE: + return new DeviceOrganizationDAOImpl(); + case DataBaseTypes.DB_TYPE_MYSQL: + return new DeviceOrganizationMysqlDAOImpl(); + default: + throw new UnsupportedDatabaseEngineException("Unsupported database engine : " + databaseEngine); + } + } + throw new IllegalStateException("Database engine has not initialized properly."); + } +} + + diff --git a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/main/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/dao/impl/DeviceOrganizationDAOImpl.java b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/main/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/dao/impl/DeviceOrganizationDAOImpl.java new file mode 100644 index 0000000000..432af7ff77 --- /dev/null +++ b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/main/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/dao/impl/DeviceOrganizationDAOImpl.java @@ -0,0 +1,986 @@ +/* + * Copyright (c) 2018 - 2023, 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.device.mgt.extensions.device.organization.dao.impl; + +import io.entgra.device.mgt.core.device.mgt.extensions.device.organization.dao.DeviceOrganizationDAO; +import io.entgra.device.mgt.core.device.mgt.extensions.device.organization.dao.util.ConnectionManagerUtil; +import io.entgra.device.mgt.core.device.mgt.extensions.device.organization.dto.AdditionResult; +import io.entgra.device.mgt.core.device.mgt.extensions.device.organization.dto.DeviceNode; +import io.entgra.device.mgt.core.device.mgt.extensions.device.organization.dto.DeviceNodeResult; +import io.entgra.device.mgt.core.device.mgt.extensions.device.organization.dto.DeviceOrganization; +import io.entgra.device.mgt.core.device.mgt.extensions.device.organization.dto.PaginationRequest; +import io.entgra.device.mgt.core.device.mgt.extensions.device.organization.exception.DBConnectionException; +import io.entgra.device.mgt.core.device.mgt.extensions.device.organization.exception.DeviceOrganizationMgtDAOException; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Timestamp; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.HashSet; +import java.util.List; +import java.util.Objects; +import java.util.Set; + +import static io.entgra.device.mgt.core.device.mgt.extensions.device.organization.dao.util.DeviceOrganizationDaoUtil.getDeviceFromResultSet; +import static io.entgra.device.mgt.core.device.mgt.extensions.device.organization.dao.util.DeviceOrganizationDaoUtil.loadDeviceOrganization; +import static io.entgra.device.mgt.core.device.mgt.extensions.device.organization.dao.util.DeviceOrganizationDaoUtil.loadDeviceOrganizationWithDeviceDetails; + +/** + * Implementation of the DeviceOrganizationDAO interface. + */ +public class DeviceOrganizationDAOImpl implements DeviceOrganizationDAO { + + private static final Log log = LogFactory.getLog(DeviceOrganizationDAOImpl.class); + + /** + * {@inheritDoc} + */ + @Override + public DeviceNodeResult getChildrenOfDeviceNode(int deviceId, int maxDepth, boolean includeDevice, int tenantID) + throws DeviceOrganizationMgtDAOException { + List childNodes = new ArrayList<>(); + Set organizations = new HashSet<>(); + Set visited = new HashSet<>(); + Set twiceVisited = new HashSet<>(); + + try { + Connection conn = ConnectionManagerUtil.getDBConnection(); + DeviceNode deviceNode = getDeviceDetails(deviceId, conn); + boolean parentAdded = false; // Flag to track whether the parent device has been added + getChildrenRecursive( + deviceNode, + maxDepth, + visited, + twiceVisited, + conn, + childNodes, + includeDevice, + parentAdded, + tenantID, + organizations + ); + if (!includeDevice + && !parentAdded + ) { + childNodes.add(deviceNode); // Add the parent device if it hasn't been added and includeDevice is false. + } + return new DeviceNodeResult(childNodes, organizations); + } catch (DBConnectionException e) { + String msg = "Error occurred while obtaining DB connection to retrieve all child devices for " + + "parent device ID " + deviceId; + log.error(msg); + throw new DeviceOrganizationMgtDAOException(msg, e); + } catch (SQLException e) { + String msg = "Error occurred while processing SQL to retrieve all child devices for " + + "parent device ID " + deviceId; + log.error(msg); + throw new DeviceOrganizationMgtDAOException(msg, e); + } + } + + private void getChildrenRecursive(DeviceNode node, + int maxDepth, + Set visited, + Set twiceVisited, + Connection conn, + List childNodes, + boolean includeDevice, + boolean parentAdded, + int tenantID, + Set organizations + ) + throws SQLException { + if (maxDepth <= 0) { + return; + } + if (twiceVisited.contains(node.getDeviceId())) { + return; + } + + if (visited.contains(node.getDeviceId())) { + twiceVisited.add(node.getDeviceId()); + } + + visited.add(node.getDeviceId()); + + String sql = "SELECT D.ID, D.NAME, D.DESCRIPTION, D.DEVICE_IDENTIFICATION, DT.NAME AS DEVICE_TYPE_NAME, " + + "DO.ORGANIZATION_ID, DO.TENANT_ID, DO.DEVICE_ID, DO.PARENT_DEVICE_ID, DO.DEVICE_ORGANIZATION_META ," + + "DO.LAST_UPDATED_TIMESTAMP FROM DM_DEVICE D " + + "JOIN DM_DEVICE_ORGANIZATION DO ON D.ID = DO.DEVICE_ID " + + "JOIN DM_DEVICE_TYPE DT ON D.DEVICE_TYPE_ID = DT.ID " + + "WHERE DO.TENANT_ID = ? AND DO.PARENT_DEVICE_ID = ? "; + + boolean hasChildren = false; + try (PreparedStatement stmt = conn.prepareStatement(sql)) { + stmt.setInt(1, tenantID); + stmt.setInt(2, node.getDeviceId()); + + try (ResultSet rs = stmt.executeQuery()) { + DeviceNode child; + DeviceOrganization organization; + while (rs.next()) { + child = getDeviceFromResultSet(rs); + node.getChildren().add(child); + hasChildren = true; + if (includeDevice + && !parentAdded + ) { + childNodes.add(node); // Add the parent device only if includeDevice is true and it hasn't been added. + parentAdded = true; // Set the flag to true after adding the parent device. + } + + organization = loadDeviceOrganization(rs); + organizations.add(organization); + + getChildrenRecursive( + child, + (maxDepth - 1), + visited, + twiceVisited, + conn, + childNodes, + includeDevice, + parentAdded, + tenantID, + organizations + ); + } + } + } + + // Add the parent node if it doesn't have children and includeDevice is true + if (!hasChildren && includeDevice && !parentAdded) { + childNodes.add(node); + parentAdded = true; + } + } + + /** + * {@inheritDoc} + */ + @Override + public DeviceNodeResult getParentsOfDeviceNode(int deviceId, int maxDepth, boolean includeDevice, int tenantID) + throws DeviceOrganizationMgtDAOException { + + List parentNodes = new ArrayList<>(); + Set organizations = new HashSet<>(); + Set visited = new HashSet<>(); + Set twiceVisited = new HashSet<>(); + try { + Connection conn = ConnectionManagerUtil.getDBConnection(); + DeviceNode deviceNode = getDeviceDetails(deviceId, conn); + boolean childAdded = false; + getParentsRecursive( + deviceNode, + maxDepth, + visited, + twiceVisited, + conn, + parentNodes, + includeDevice, + childAdded, + tenantID, + organizations); + if (!includeDevice && !childAdded) { + parentNodes.add(deviceNode); + } + + return new DeviceNodeResult(parentNodes, organizations); + } catch (DBConnectionException e) { + String msg = "Error occurred while obtaining DB connection to retrieve parent devices for " + + "device ID " + deviceId; + log.error(msg); + throw new DeviceOrganizationMgtDAOException(msg, e); + } catch (SQLException e) { + String msg = "Error occurred while processing SQL to retrieve parent devices for " + + "device ID " + deviceId; + log.error(msg); + throw new DeviceOrganizationMgtDAOException(msg, e); + } + } + + private void getParentsRecursive(DeviceNode node, + int maxDepth, + Set visited, + Set twiceVisited, + Connection conn, + List parentNodes, + boolean includeDevice, + boolean childAdded, + int tenantID, + Set organizations) + throws SQLException { + if (maxDepth <= 0) { + return; + } + if (twiceVisited.contains(node.getDeviceId())) { + return; + } + + if (visited.contains(node.getDeviceId())) { + twiceVisited.add(node.getDeviceId()); + } + + visited.add(node.getDeviceId()); + + String sql = "SELECT D.ID, D.NAME, D.DESCRIPTION, D.DEVICE_IDENTIFICATION, DT.NAME AS DEVICE_TYPE_NAME, " + + "DO.ORGANIZATION_ID, DO.TENANT_ID, DO.DEVICE_ID, DO.PARENT_DEVICE_ID, DO.DEVICE_ORGANIZATION_META ," + + "DO.LAST_UPDATED_TIMESTAMP FROM DM_DEVICE D " + + "JOIN DM_DEVICE_ORGANIZATION DO ON D.ID = DO.PARENT_DEVICE_ID " + + "JOIN DM_DEVICE_TYPE DT ON D.DEVICE_TYPE_ID = DT.ID " + + "WHERE DO.TENANT_ID = ? AND DO.DEVICE_ID = ?"; + + try (PreparedStatement stmt = conn.prepareStatement(sql)) { + stmt.setInt(1, tenantID); + stmt.setInt(2, node.getDeviceId()); + try (ResultSet rs = stmt.executeQuery()) { + DeviceNode parent; + DeviceOrganization organization; + while (rs.next()) { + parent = getDeviceFromResultSet(rs); + node.getParents().add(parent); + if (includeDevice && !childAdded) { + parentNodes.add(node); + childAdded = true; + } + + organization = loadDeviceOrganization(rs); + organizations.add(organization); + + getParentsRecursive( + parent, + (maxDepth - 1), + visited, + twiceVisited, + conn, + parentNodes, + includeDevice, + childAdded, + tenantID, + organizations); + } + } + } + } + + private DeviceNode getDeviceDetails(int deviceId, Connection conn) throws SQLException { + String sql = "SELECT D.ID, D.NAME, D.DESCRIPTION, D.DEVICE_IDENTIFICATION, DT.NAME AS DEVICE_TYPE_NAME " + + "FROM DM_DEVICE D " + + "JOIN DM_DEVICE_TYPE DT ON D.DEVICE_TYPE_ID = DT.ID " + + "WHERE D.ID = ?"; + DeviceNode node = new DeviceNode(); + try (PreparedStatement stmt = conn.prepareStatement(sql)) { + stmt.setInt(1, deviceId); + try (ResultSet rs = stmt.executeQuery()) { + if (rs.next()) { + node = getDeviceFromResultSet(rs); + } + } + } + return node; + } + + /** + * {@inheritDoc} + */ + @Override + public List getAllDeviceOrganizations() throws DeviceOrganizationMgtDAOException { + List deviceOrganizations = new ArrayList<>(); + try { + Connection conn = ConnectionManagerUtil.getDBConnection(); + String sql = "SELECT * FROM DM_DEVICE_ORGANIZATION"; + try (PreparedStatement stmt = conn.prepareStatement(sql)) { + try (ResultSet rs = stmt.executeQuery()) { + DeviceOrganization deviceOrganization; + while (rs.next()) { + deviceOrganization = loadDeviceOrganization(rs); + deviceOrganizations.add(deviceOrganization); + } + } + } + return deviceOrganizations; + } catch (DBConnectionException e) { + String msg = "Error occurred while obtaining DB connection to retrieving all device organizations details."; + log.error(msg); + throw new DeviceOrganizationMgtDAOException(msg, e); + } catch (SQLException e) { + String msg = "Error occurred while processing SQL to retrieving all device organizations."; + log.error(msg); + throw new DeviceOrganizationMgtDAOException(msg, e); + } + } + + /** + * {@inheritDoc} + */ + @Override + public List getDeviceOrganizationRoots(PaginationRequest request, int tenantID) + throws DeviceOrganizationMgtDAOException { + List deviceOrganizations = new ArrayList<>(); + try { + Connection conn = ConnectionManagerUtil.getDBConnection(); + String sql = "SELECT D.ID, D.NAME, D.DESCRIPTION, D.DEVICE_IDENTIFICATION, DT.NAME AS DEVICE_TYPE_NAME, " + + "DO.ORGANIZATION_ID, DO.TENANT_ID, DO.DEVICE_ID, DO.PARENT_DEVICE_ID, DO.DEVICE_ORGANIZATION_META ," + + "DO.LAST_UPDATED_TIMESTAMP FROM DM_DEVICE_ORGANIZATION DO JOIN DM_DEVICE D ON D.ID = DO.DEVICE_ID " + + "JOIN DM_DEVICE_TYPE DT ON D.DEVICE_TYPE_ID = DT.ID " + + "WHERE DO.TENANT_ID = ? AND (DO.PARENT_DEVICE_ID IS NULL AND " + + "DO.DEVICE_ID NOT IN " + + "(SELECT DEVICE_ID FROM DM_DEVICE_ORGANIZATION " + + "WHERE PARENT_DEVICE_ID IS NOT NULL)) " + + "LIMIT ? OFFSET ?"; + + try (PreparedStatement stmt = conn.prepareStatement(sql)) { + stmt.setInt(1, tenantID); + stmt.setInt(2, request.getLimit()); + stmt.setInt(3, request.getOffSet()); + try (ResultSet rs = stmt.executeQuery()) { + DeviceOrganization deviceOrganization; + while (rs.next()) { + deviceOrganization = loadDeviceOrganizationWithDeviceDetails(rs); + deviceOrganizations.add(deviceOrganization); + } + } + } + return deviceOrganizations; + } catch (DBConnectionException e) { + String msg = "Error occurred while obtaining DB connection to retrieving device organization root details."; + log.error(msg); + throw new DeviceOrganizationMgtDAOException(msg, e); + } catch (SQLException e) { + String msg = "Error occurred while processing SQL to retrieving device organization roots."; + log.error(msg); + throw new DeviceOrganizationMgtDAOException(msg, e); + } + } + + + /** + * {@inheritDoc} + */ + @Override + public List getDeviceOrganizationLeafs(PaginationRequest request, int tenantID) throws DeviceOrganizationMgtDAOException { + List deviceOrganizations = new ArrayList<>(); + try { + Connection conn = ConnectionManagerUtil.getDBConnection(); + String sql = "SELECT * FROM DM_DEVICE_ORGANIZATION WHERE TENANT_ID = ? AND DEVICE_ID NOT IN " + + "(SELECT DISTINCT PARENT_DEVICE_ID FROM DM_DEVICE_ORGANIZATION WHERE PARENT_DEVICE_ID IS NOT NULL ) " + + "LIMIT ? OFFSET ?"; + try (PreparedStatement stmt = conn.prepareStatement(sql)) { + stmt.setInt(1, tenantID); + stmt.setInt(2, request.getLimit()); + stmt.setInt(3, request.getOffSet()); + try (ResultSet rs = stmt.executeQuery()) { + DeviceOrganization deviceOrganization; + while (rs.next()) { + deviceOrganization = loadDeviceOrganization(rs); + deviceOrganizations.add(deviceOrganization); + } + } + } + return deviceOrganizations; + } catch (DBConnectionException e) { + String msg = "Error occurred while obtaining DB connection to retrieving all device organizations details."; + log.error(msg); + throw new DeviceOrganizationMgtDAOException(msg, e); + } catch (SQLException e) { + String msg = "Error occurred while processing SQL to retrieving all device organizations."; + log.error(msg); + throw new DeviceOrganizationMgtDAOException(msg, e); + } + } + + + /** + * {@inheritDoc} + */ + @Override + public AdditionResult addDeviceOrganization(DeviceOrganization deviceOrganization) + throws DeviceOrganizationMgtDAOException { + + AdditionResult result = new AdditionResult(); + int inserted = 0; + try { + String sql = "INSERT INTO DM_DEVICE_ORGANIZATION (TENANT_ID, DEVICE_ID, PARENT_DEVICE_ID, " + + "DEVICE_ORGANIZATION_META, LAST_UPDATED_TIMESTAMP)" + + " VALUES (?, ?, ?, ?, ?)"; + + Connection conn = ConnectionManagerUtil.getDBConnection(); + Calendar calendar = Calendar.getInstance(); + Timestamp timestamp = new Timestamp(calendar.getTime().getTime()); + try (PreparedStatement stmt = conn.prepareStatement(sql)) { + stmt.setInt(1, deviceOrganization.getTenantID()); + stmt.setInt(2, deviceOrganization.getDeviceId()); + if (deviceOrganization.getParentDeviceId() != null) { + stmt.setInt(3, deviceOrganization.getParentDeviceId()); + } else { + stmt.setNull(3, java.sql.Types.INTEGER); + } + if (deviceOrganization.getDeviceOrganizationMeta() != null) { + stmt.setString(4, deviceOrganization.getDeviceOrganizationMeta()); + } else { + stmt.setString(4, ""); + } + + stmt.setTimestamp(5, timestamp); + inserted = stmt.executeUpdate(); + + if (deviceOrganization.isCheckCyclicRelationship()) { + boolean isCyclic = isCyclicRelationshipExist(conn, deviceOrganization.getDeviceId(), + deviceOrganization.getParentDeviceId(), deviceOrganization.getTenantID()); + if (isCyclic) { + result.setCyclic(true); + return result; + } else { + if (inserted > 0) { + result.setInserted(true); + return result; + } + } + } + if (inserted > 0) { + result.setInserted(true); + } + return result; + } + } catch (DBConnectionException e) { + String msg = "Error occurred while obtaining DB connection to insert device organization for " + + deviceOrganization.getDeviceId(); + log.error(msg); + throw new DeviceOrganizationMgtDAOException(msg, e); + } catch (SQLException e) { + String msg = "Error occurred while processing SQL to insert device organization for " + + deviceOrganization.getDeviceId(); + log.error(msg); + throw new DeviceOrganizationMgtDAOException(msg, e); + } + } + + /** + * Implementation for a test + * + * @param tenantID + * @throws DeviceOrganizationMgtDAOException + */ + + @Override + public void addAllDevices(int tenantID) throws DeviceOrganizationMgtDAOException { + + try { + ConnectionManagerUtil.beginDBTransaction(); + + // Add devices from 1 to 500 + for (int i = 21; i <= 500; i++) { + String deviceName = "Meter_" + String.format("%04d", i); + String deviceIdentification = String.format("%04d", i); + + String query = "INSERT INTO DM_DEVICE (DESCRIPTION, NAME, DEVICE_TYPE_ID, DEVICE_IDENTIFICATION," + + " LAST_UPDATED_TIMESTAMP, TENANT_ID) VALUES (?, ?, ?, ?, CURRENT_TIMESTAMP(), ?)"; + + Connection connection = ConnectionManagerUtil.getDBConnection(); + try (PreparedStatement statement = connection.prepareStatement(query)) { + statement.setString(1, "Test Device " + i); + statement.setString(2, deviceName); + statement.setInt(3, 1); // Assuming DEVICE_TYPE_ID is 1 + statement.setString(4, deviceIdentification); + statement.setInt(5, tenantID); + + statement.executeUpdate(); + } + } + + ConnectionManagerUtil.commitDBTransaction(); + } catch (DBConnectionException | SQLException e) { + // Handle exceptions or log errors as needed + e.printStackTrace(); +// Assert.fail("Exception occurred during device addition: " + e.getMessage()); + } finally { + ConnectionManagerUtil.closeDBConnection(); + } + } + + @Override + public void addOrganizations(int tenantID, int start, int end) throws DeviceOrganizationMgtDAOException { + + for (int i = start; i <= end; i++) { + DeviceOrganization organization = new DeviceOrganization(); + organization.setDeviceId(i); + organization.setParentDeviceId(i - 1); + organization.setUpdateTime(new Date(System.currentTimeMillis())); + organization.setTenantID(tenantID); + + try { + ConnectionManagerUtil.beginDBTransaction(); + addDeviceOrganization(organization); + ConnectionManagerUtil.commitDBTransaction(); + } catch (DBConnectionException | DeviceOrganizationMgtDAOException e) { + // Handle exceptions or log errors as needed + e.printStackTrace(); + } finally { + ConnectionManagerUtil.closeDBConnection(); + } + } + } + + // @Override + private boolean isCyclicRelationshipExist(Connection conn, int deviceID, Integer parentDeviceID, int tenantID) + throws DeviceOrganizationMgtDAOException { + + Set visited = new HashSet<>(); + Set ancestors = new HashSet<>(); + try { + // Fetch all ancestors of the current device + getAllAncestors(conn, deviceID, tenantID, visited, ancestors); + + // Check if the parentDeviceID is among the ancestors + return ancestors.contains(deviceID); + } + catch (SQLException e) { + String msg = "Error occurred while processing SQL to check cyclic relationship for deviceID " + + deviceID + " and parentDeviceID " + parentDeviceID; + log.error(msg); + throw new DeviceOrganizationMgtDAOException(msg, e); + } + } + + private Set getAllAncestors(Connection conn, int deviceID, int tenantID, Set visited, Set ancestors) + throws SQLException, DeviceOrganizationMgtDAOException { + + try (PreparedStatement statement = conn.prepareStatement( + "SELECT PARENT_DEVICE_ID FROM DM_DEVICE_ORGANIZATION WHERE DEVICE_ID = ? AND TENANT_ID = ?")) { + statement.setInt(1, deviceID); + statement.setInt(2, tenantID); + + try (ResultSet resultSet = statement.executeQuery()) { + while (resultSet.next()) { + int parentDeviceID = resultSet.getInt("PARENT_DEVICE_ID"); + + if (!visited.contains(parentDeviceID)) { + // If the parentDeviceID has not been visited, add it to the visited set + visited.add(parentDeviceID); + + // Recursively fetch ancestors for the current parentDeviceID + ancestors.add(parentDeviceID); + ancestors.addAll(getAllAncestors(conn, parentDeviceID, tenantID, visited, ancestors)); + + // Remove the special value if it was added due to a previous cyclic relationship + ancestors.remove(-1); + } else { + // Detected cyclic relationship + + ancestors.add(-1); // Special value indicating a cyclic relationship + return ancestors; + } + } + } + } + + return ancestors; + } + + + //TODO : FOR ORACLE AND POSTGRES SQL isCyclicRelationshipExist need to be implemented.Below method work only for H2 sql + + /** + * {@inheritDoc} + */ + public boolean isCyclicRelationshipExistSQL(int deviceID, Integer parentDeviceID, int tenantID) + throws DeviceOrganizationMgtDAOException { + try { + Connection conn = ConnectionManagerUtil.getDBConnection(); + String sql = "WITH RECURSIVE all_paths AS ( " + + "SELECT DEVICE_ID, CAST(DEVICE_ID AS VARCHAR(500)) AS path, 0 AS is_cycle " + + "FROM DM_DEVICE_ORGANIZATION WHERE PARENT_DEVICE_ID = ? " + + "UNION ALL " + + "SELECT r.DEVICE_ID, CONCAT(d.path, ',', r.DEVICE_ID), " + + "ARRAY_CONTAINS(r.DEVICE_ID, STRING_SPLIT(d.path, ',')) AS is_cycle " + + "FROM DM_DEVICE_ORGANIZATION r, all_paths d WHERE " + + "r.PARENT_DEVICE_ID = d.DEVICE_ID AND d.is_cycle = 0) " + + "SELECT path, is_cycle FROM all_paths WHERE is_cycle = 1 "; + try (PreparedStatement statement = conn.prepareStatement(sql)) { + if (parentDeviceID != null) { + statement.setInt(1, parentDeviceID); + } + try (ResultSet resultSet = statement.executeQuery()) { + return resultSet.next(); + } + } + } catch (DBConnectionException e) { + String msg = "Error occurred while obtaining DB connection to check cyclic relationship for deviceID " + + deviceID + " and parentDeviceID " + parentDeviceID; + log.error(msg); + throw new DeviceOrganizationMgtDAOException(msg, e); + } catch (SQLException e) { + String msg = "Error occurred while processing SQL to check cyclic relationship for deviceID " + + deviceID + " and parentDeviceID " + parentDeviceID; + log.error(msg); + throw new DeviceOrganizationMgtDAOException(msg, e); + } + } + + /** + * {@inheritDoc} + */ + @Override + public boolean isDeviceOrganizationExist(int deviceId, Integer parentDeviceId, int tenantID) + throws DeviceOrganizationMgtDAOException { + try { + String sql; + Connection conn = ConnectionManagerUtil.getDBConnection(); + + if (parentDeviceId != null) { + sql = "SELECT * FROM DM_DEVICE_ORGANIZATION WHERE TENANT_ID = ? AND DEVICE_ID = ? AND PARENT_DEVICE_ID = ?"; + } else { + sql = "SELECT * FROM DM_DEVICE_ORGANIZATION WHERE TENANT_ID = ? AND DEVICE_ID = ? AND PARENT_DEVICE_ID IS NULL"; + } + + try (PreparedStatement stmt = conn.prepareStatement(sql)) { + stmt.setInt(1, tenantID); + stmt.setInt(2, deviceId); + if (parentDeviceId != null) { + stmt.setInt(3, parentDeviceId); + } + + try (ResultSet rs = stmt.executeQuery()) { + return rs.next(); // Returns true if a match is found, false otherwise + } + } + } catch (DBConnectionException e) { + String msg = "Error occurred while obtaining DB connection to check organization existence for deviceId " + + deviceId + " and parentDeviceId " + parentDeviceId; + log.error(msg); + throw new DeviceOrganizationMgtDAOException(msg, e); + } catch (SQLException e) { + String msg = "Error occurred while processing SQL to check organization existence for deviceId " + + deviceId + " and parentDeviceId " + parentDeviceId; + log.error(msg); + throw new DeviceOrganizationMgtDAOException(msg, e); + } + } + + /** + * {@inheritDoc} + */ + @Override + public DeviceOrganization getDeviceOrganizationByUniqueKey(int deviceId, Integer parentDeviceId, int tenantID) + throws DeviceOrganizationMgtDAOException { + try { + String sql; + Connection conn = ConnectionManagerUtil.getDBConnection(); + + if (parentDeviceId != null) { + sql = "SELECT * FROM DM_DEVICE_ORGANIZATION WHERE TENANT_ID = ? AND DEVICE_ID = ? AND PARENT_DEVICE_ID = ?"; + } else { + sql = "SELECT * FROM DM_DEVICE_ORGANIZATION WHERE TENANT_ID = ? AND DEVICE_ID = ? AND PARENT_DEVICE_ID IS NULL"; + } + + try (PreparedStatement stmt = conn.prepareStatement(sql)) { + stmt.setInt(1, tenantID); + stmt.setInt(2, deviceId); + if (parentDeviceId != null) { + stmt.setInt(3, parentDeviceId); + } + + try (ResultSet rs = stmt.executeQuery()) { + if (rs.next()) { + return loadDeviceOrganization(rs); + } + } + } + return null; // No matching device organization found. + } catch (DBConnectionException e) { + String msg = "Error occurred while obtaining DB connection to get device organization for DEVICE_ID " + + deviceId + " and PARENT_DEVICE_ID " + parentDeviceId; + log.error(msg); + throw new DeviceOrganizationMgtDAOException(msg, e); + } catch (SQLException e) { + String msg = "Error occurred while processing SQL to get device organization for DEVICE_ID " + + deviceId + " and PARENT_DEVICE_ID " + parentDeviceId; + log.error(msg); + throw new DeviceOrganizationMgtDAOException(msg, e); + } + } + + + /** + * {@inheritDoc} + */ + @Override + public boolean updateDeviceOrganization(DeviceOrganization deviceOrganization) + throws DeviceOrganizationMgtDAOException { + String msg; + DeviceOrganization organization = getDeviceOrganizationByID(deviceOrganization.getOrganizationId(), deviceOrganization.getTenantID()); + + if (organization == null) { + msg = "Device Organization does not exist for organization ID = " + deviceOrganization.getOrganizationId(); + throw new DeviceOrganizationMgtDAOException(msg); + } + + try { + String sql = "UPDATE DM_DEVICE_ORGANIZATION SET "; + if ((organization.getDeviceId() != deviceOrganization.getDeviceId()) && deviceOrganization.getDeviceId() > 0) { + sql += "DEVICE_ID = ? , "; + } + if ((deviceOrganization.getParentDeviceId() == null || deviceOrganization.getParentDeviceId() > 0) && + !Objects.equals(organization.getParentDeviceId(), deviceOrganization.getParentDeviceId())) { + sql += "PARENT_DEVICE_ID = ? ,"; + } + if (!Objects.equals(organization.getDeviceOrganizationMeta(), deviceOrganization.getDeviceOrganizationMeta())) { + sql += "DEVICE_ORGANIZATION_META = ? ,"; + } + sql += "LAST_UPDATED_TIMESTAMP = ? WHERE ORGANIZATION_ID = ? "; + + Connection conn = ConnectionManagerUtil.getDBConnection(); + Calendar calendar = Calendar.getInstance(); + Timestamp timestamp = new Timestamp(calendar.getTime().getTime()); + try (PreparedStatement stmt = conn.prepareStatement(sql)) { + int x = 0; + + if ((organization.getDeviceId() != deviceOrganization.getDeviceId()) && deviceOrganization.getDeviceId() > 0) { + stmt.setInt(++x, deviceOrganization.getDeviceId()); + } + if (!Objects.equals(organization.getParentDeviceId(), deviceOrganization.getParentDeviceId())) { + stmt.setInt(++x, deviceOrganization.getParentDeviceId()); + } + if (!Objects.equals(organization.getDeviceOrganizationMeta(), deviceOrganization.getDeviceOrganizationMeta())) { + stmt.setString(++x, deviceOrganization.getDeviceOrganizationMeta()); + } + stmt.setTimestamp(++x, timestamp); + stmt.setInt(++x, deviceOrganization.getOrganizationId()); + return stmt.executeUpdate() > 0; + } + + } catch (DBConnectionException e) { + msg = "Error occurred while obtaining DB connection to update device organization for " + + deviceOrganization.getOrganizationId(); + log.error(msg); + throw new DeviceOrganizationMgtDAOException(msg, e); + } catch (SQLException e) { + msg = "Error occurred while processing SQL to update device organization for " + + deviceOrganization.getOrganizationId(); + log.error(msg); + throw new DeviceOrganizationMgtDAOException(msg, e); + } + } + + /** + * {@inheritDoc} + */ + @Override + public DeviceOrganization getDeviceOrganizationByID(int organizationId, int tenantID) throws DeviceOrganizationMgtDAOException { + try { + Connection conn = ConnectionManagerUtil.getDBConnection(); + String sql = "SELECT * FROM DM_DEVICE_ORGANIZATION DO WHERE DO.TENANT_ID = ? AND DO.ORGANIZATION_ID = ? "; + + try (PreparedStatement stmt = conn.prepareStatement(sql)) { + stmt.setInt(1, tenantID); + stmt.setInt(2, organizationId); + try (ResultSet rs = stmt.executeQuery()) { + if (rs.next()) { + return loadDeviceOrganization(rs); + } + log.info("No Device Organization found for retrieving for organizationID = " + organizationId); + return null; + } + } + + } catch (DBConnectionException e) { + String msg = "Error occurred while obtaining DB connection to get device organization details for " + + "organizationID = " + organizationId; + log.error(msg); + throw new DeviceOrganizationMgtDAOException(msg, e); + } catch (SQLException e) { + String msg = "Error occurred while processing SQL to get device organization details for " + + "organizationID = " + organizationId; + log.error(msg); + throw new DeviceOrganizationMgtDAOException(msg, e); + } + } + + /** + * {@inheritDoc} + */ + @Override + public boolean deleteDeviceOrganizationByUniqueKey(int deviceId, Integer parentDeviceId, int tenantID) throws DeviceOrganizationMgtDAOException { + try { + Connection conn = ConnectionManagerUtil.getDBConnection(); + String deleteOrganizationSql = "DELETE FROM DM_DEVICE_ORGANIZATION WHERE TENANT_ID = ? AND DEVICE_ID = ? AND PARENT_DEVICE_ID = ?"; + + try (PreparedStatement deleteOrgStmt = conn.prepareStatement(deleteOrganizationSql)) { + + // Delete the organization + deleteOrgStmt.setInt(1, tenantID); + deleteOrgStmt.setInt(2, deviceId); + deleteOrgStmt.setInt(3, parentDeviceId); + return deleteOrgStmt.executeUpdate() > 0; + } + + } catch (DBConnectionException e) { + String msg = "Error occurred while obtaining DB connection to delete device organization for " + + "tenantID = " + tenantID + ", deviceId = " + deviceId + "and parentDeviceId = " + parentDeviceId; + log.error(msg); + throw new DeviceOrganizationMgtDAOException(msg, e); + } catch (SQLException e) { + String msg = "Error occurred while obtaining DB connection to delete device organization for " + + "tenantID = " + tenantID + ", deviceId = " + deviceId + "and parentDeviceId = " + parentDeviceId; + log.error(msg); + throw new DeviceOrganizationMgtDAOException(msg, e); + } + } + + /** + * {@inheritDoc} + */ + @Override + public boolean deleteDeviceOrganizationByID(int organizationId, int tenantID) throws DeviceOrganizationMgtDAOException { + try { + Connection conn = ConnectionManagerUtil.getDBConnection(); + String deleteOrganizationSql = "DELETE FROM DM_DEVICE_ORGANIZATION WHERE TENANT_ID = ? AND ORGANIZATION_ID = ?"; + + try (PreparedStatement deleteOrgStmt = conn.prepareStatement(deleteOrganizationSql)) { + + // Delete the organization + deleteOrgStmt.setInt(1, tenantID); + deleteOrgStmt.setInt(2, organizationId); + return deleteOrgStmt.executeUpdate() > 0; + } + + } catch (DBConnectionException e) { + String msg = "Error occurred while obtaining DB connection to delete device organization for " + + organizationId; + log.error(msg); + throw new DeviceOrganizationMgtDAOException(msg, e); + } catch (SQLException e) { + String msg = "Error occurred while processing SQL to delete device organization details for " + + organizationId; + log.error(msg); + throw new DeviceOrganizationMgtDAOException(msg, e); + } + } + + /** + * {@inheritDoc} + */ + @Override + public boolean deleteDeviceAssociations(int deviceId, int tenantID) throws DeviceOrganizationMgtDAOException { + try { + Connection conn = ConnectionManagerUtil.getDBConnection(); + String deleteByDeviceIdSql = "DELETE FROM DM_DEVICE_ORGANIZATION WHERE TENANT_ID = ? AND DEVICE_ID = ?"; + String deleteByParentDeviceIdSql = "DELETE FROM DM_DEVICE_ORGANIZATION WHERE TENANT_ID = ? AND PARENT_DEVICE_ID = ?"; + + try (PreparedStatement deleteByDeviceIdStmt = conn.prepareStatement(deleteByDeviceIdSql); + PreparedStatement deleteByParentDeviceIdStmt = conn.prepareStatement(deleteByParentDeviceIdSql)) { + + // Delete device organizations where the device is the device_id + deleteByDeviceIdStmt.setInt(1, tenantID); + deleteByDeviceIdStmt.setInt(2, deviceId); + + // Delete device organizations where the device is the parent_device_id + deleteByParentDeviceIdStmt.setInt(1, tenantID); + deleteByParentDeviceIdStmt.setInt(2, deviceId); + + return deleteByDeviceIdStmt.executeUpdate() > 0 | deleteByParentDeviceIdStmt.executeUpdate() > 0; + + } + } catch (DBConnectionException e) { + String msg = "Error occurred while obtaining DB connection to delete device organization for device ID" + + deviceId; + log.error(msg); + throw new DeviceOrganizationMgtDAOException(msg, e); + } catch (SQLException e) { + String msg = "Error occurred while processing SQL to delete device organization details for device ID " + + deviceId; + log.error(msg); + throw new DeviceOrganizationMgtDAOException(msg, e); + } + } + + /** + * {@inheritDoc} + */ + @Override + public boolean isDeviceIdExist(int deviceId, int tenantID) throws DeviceOrganizationMgtDAOException { + try { + Connection conn = ConnectionManagerUtil.getDBConnection(); + String sql = "SELECT 1 " + + "FROM DM_DEVICE_ORGANIZATION " + + "WHERE TENANT_ID = ? AND (device_id = ? OR parent_device_id = ?) " + + "LIMIT 1"; + + try (PreparedStatement stmt = conn.prepareStatement(sql)) { + stmt.setInt(1, tenantID); + stmt.setInt(2, deviceId); + stmt.setInt(3, deviceId); + + try (ResultSet rs = stmt.executeQuery()) { + return rs.next(); // Returns true if a match is found, false otherwise + } + } + } catch (DBConnectionException e) { + String msg = "Error occurred while obtaining DB connection to query device organization for device ID" + + deviceId; + log.error(msg); + throw new DeviceOrganizationMgtDAOException(msg, e); + } catch (SQLException e) { + String msg = "Error occurred while processing SQL to query device organization details for device ID " + + deviceId; + log.error(msg); + throw new DeviceOrganizationMgtDAOException(msg, e); + } + } + + /** + * {@inheritDoc} + */ + @Override + public boolean isChildDeviceIdExist(int deviceId, int tenantID) throws DeviceOrganizationMgtDAOException { + try { + Connection conn = ConnectionManagerUtil.getDBConnection(); + String sql = "SELECT 1 " + + "FROM DM_DEVICE_ORGANIZATION " + + "WHERE TENANT_ID = ? AND device_id = ? " + + "LIMIT 1"; + + try (PreparedStatement stmt = conn.prepareStatement(sql)) { + stmt.setInt(1, tenantID); + stmt.setInt(2, deviceId); + + try (ResultSet rs = stmt.executeQuery()) { + return rs.next(); // Returns true if a match is found, false otherwise + } + } + } catch (DBConnectionException e) { + String msg = "Error occurred while obtaining DB connection to query device organization for device ID" + + deviceId; + log.error(msg); + throw new DeviceOrganizationMgtDAOException(msg, e); + } catch (SQLException e) { + String msg = "Error occurred while processing SQL to query device organization details for device ID " + + deviceId; + log.error(msg); + throw new DeviceOrganizationMgtDAOException(msg, e); + } + } + + +} diff --git a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/main/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/dao/impl/DeviceOrganizationMysqlDAOImpl.java b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/main/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/dao/impl/DeviceOrganizationMysqlDAOImpl.java new file mode 100644 index 0000000000..55a141b9ad --- /dev/null +++ b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/main/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/dao/impl/DeviceOrganizationMysqlDAOImpl.java @@ -0,0 +1,938 @@ +/* + * Copyright (c) 2018 - 2023, 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.device.mgt.extensions.device.organization.dao.impl; + +import io.entgra.device.mgt.core.device.mgt.extensions.device.organization.dao.DeviceOrganizationDAO; +import io.entgra.device.mgt.core.device.mgt.extensions.device.organization.dao.util.ConnectionManagerUtil; +import io.entgra.device.mgt.core.device.mgt.extensions.device.organization.dto.AdditionResult; +import io.entgra.device.mgt.core.device.mgt.extensions.device.organization.dto.DeviceNode; +import io.entgra.device.mgt.core.device.mgt.extensions.device.organization.dto.DeviceNodeResult; +import io.entgra.device.mgt.core.device.mgt.extensions.device.organization.dto.DeviceOrganization; +import io.entgra.device.mgt.core.device.mgt.extensions.device.organization.dto.PaginationRequest; +import io.entgra.device.mgt.core.device.mgt.extensions.device.organization.exception.DBConnectionException; +import io.entgra.device.mgt.core.device.mgt.extensions.device.organization.exception.DeviceOrganizationMgtDAOException; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Timestamp; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.HashSet; +import java.util.List; +import java.util.Objects; +import java.util.Set; + +import static io.entgra.device.mgt.core.device.mgt.extensions.device.organization.dao.util.DeviceOrganizationDaoUtil.getDeviceFromResultSet; +import static io.entgra.device.mgt.core.device.mgt.extensions.device.organization.dao.util.DeviceOrganizationDaoUtil.loadDeviceOrganization; +import static io.entgra.device.mgt.core.device.mgt.extensions.device.organization.dao.util.DeviceOrganizationDaoUtil.loadDeviceOrganizationWithDeviceDetails; + +/** + * Implementation of the DeviceOrganizationDAO interface. + */ +public class DeviceOrganizationMysqlDAOImpl implements DeviceOrganizationDAO { + + private static final Log log = LogFactory.getLog(DeviceOrganizationMysqlDAOImpl.class); + + /** + * {@inheritDoc} + */ + @Override + public DeviceNodeResult getChildrenOfDeviceNode(int deviceId, int maxDepth, boolean includeDevice, int tenantID) + throws DeviceOrganizationMgtDAOException { + List childNodes = new ArrayList<>(); + Set organizations = new HashSet<>(); + Set visited = new HashSet<>(); + Set twiceVisited = new HashSet<>(); + + try { + Connection conn = ConnectionManagerUtil.getDBConnection(); + DeviceNode deviceNode = getDeviceDetails(deviceId, conn); + boolean parentAdded = false; // Flag to track whether the parent device has been added + getChildrenRecursive( + deviceNode, + maxDepth, + visited, + twiceVisited, + conn, + childNodes, + includeDevice, + parentAdded, + tenantID, + organizations + ); + if (!includeDevice + && !parentAdded + ) { + childNodes.add(deviceNode); // Add the parent device if it hasn't been added and includeDevice is false. + } + return new DeviceNodeResult(childNodes, organizations); + } catch (DBConnectionException e) { + String msg = "Error occurred while obtaining DB connection to retrieve all child devices for " + + "parent device ID " + deviceId; + log.error(msg); + throw new DeviceOrganizationMgtDAOException(msg, e); + } catch (SQLException e) { + String msg = "Error occurred while processing SQL to retrieve all child devices for " + + "parent device ID " + deviceId; + log.error(msg); + throw new DeviceOrganizationMgtDAOException(msg, e); + } + } + + private void getChildrenRecursive(DeviceNode node, + int maxDepth, + Set visited, + Set twiceVisited, + Connection conn, + List childNodes, + boolean includeDevice, + boolean parentAdded, + int tenantID, + Set organizations + ) + throws SQLException { + if (maxDepth <= 0) { + return; + } + if (twiceVisited.contains(node.getDeviceId())) { + return; + } + + if (visited.contains(node.getDeviceId())) { + twiceVisited.add(node.getDeviceId()); + } + + visited.add(node.getDeviceId()); + + String sql = "SELECT D.ID, D.NAME, D.DESCRIPTION, D.DEVICE_IDENTIFICATION, DT.NAME AS DEVICE_TYPE_NAME, " + + "DO.ORGANIZATION_ID, DO.TENANT_ID, DO.DEVICE_ID, DO.PARENT_DEVICE_ID, DO.DEVICE_ORGANIZATION_META ," + + "DO.LAST_UPDATED_TIMESTAMP FROM DM_DEVICE D " + + "JOIN DM_DEVICE_ORGANIZATION DO ON D.ID = DO.DEVICE_ID " + + "JOIN DM_DEVICE_TYPE DT ON D.DEVICE_TYPE_ID = DT.ID " + + "WHERE DO.TENANT_ID = ? AND DO.PARENT_DEVICE_ID = ? "; + + boolean hasChildren = false; + try (PreparedStatement stmt = conn.prepareStatement(sql)) { + stmt.setInt(1, tenantID); + stmt.setInt(2, node.getDeviceId()); + + try (ResultSet rs = stmt.executeQuery()) { + DeviceNode child; + DeviceOrganization organization; + while (rs.next()) { + child = getDeviceFromResultSet(rs); + node.getChildren().add(child); + hasChildren = true; + if (includeDevice + && !parentAdded + ) { + childNodes.add(node); // Add the parent device only if includeDevice is true and it hasn't been added. + parentAdded = true; // Set the flag to true after adding the parent device. + } + + organization = loadDeviceOrganization(rs); + organizations.add(organization); + + getChildrenRecursive( + child, + (maxDepth - 1), + visited, + twiceVisited, + conn, + childNodes, + includeDevice, + parentAdded, + tenantID, + organizations + ); + } + } + } + + // Add the parent node if it doesn't have children and includeDevice is true + if (!hasChildren && includeDevice && !parentAdded) { + childNodes.add(node); + parentAdded = true; + } + } + + /** + * {@inheritDoc} + */ + @Override + public DeviceNodeResult getParentsOfDeviceNode(int deviceId, int maxDepth, boolean includeDevice, int tenantID) + throws DeviceOrganizationMgtDAOException { + + List parentNodes = new ArrayList<>(); + Set organizations = new HashSet<>(); + Set visited = new HashSet<>(); + Set twiceVisited = new HashSet<>(); + try { + Connection conn = ConnectionManagerUtil.getDBConnection(); + DeviceNode deviceNode = getDeviceDetails(deviceId, conn); + boolean childAdded = false; + getParentsRecursive( + deviceNode, + maxDepth, + visited, + twiceVisited, + conn, + parentNodes, + includeDevice, + childAdded, + tenantID, + organizations); + if (!includeDevice && !childAdded) { + parentNodes.add(deviceNode); + } + + return new DeviceNodeResult(parentNodes, organizations); + } catch (DBConnectionException e) { + String msg = "Error occurred while obtaining DB connection to retrieve parent devices for " + + "device ID " + deviceId; + log.error(msg); + throw new DeviceOrganizationMgtDAOException(msg, e); + } catch (SQLException e) { + String msg = "Error occurred while processing SQL to retrieve parent devices for " + + "device ID " + deviceId; + log.error(msg); + throw new DeviceOrganizationMgtDAOException(msg, e); + } + } + + private void getParentsRecursive(DeviceNode node, + int maxDepth, + Set visited, + Set twiceVisited, + Connection conn, + List parentNodes, + boolean includeDevice, + boolean childAdded, + int tenantID, + Set organizations) + throws SQLException { + if (maxDepth <= 0) { + return; + } + if (twiceVisited.contains(node.getDeviceId())) { + return; + } + + if (visited.contains(node.getDeviceId())) { + twiceVisited.add(node.getDeviceId()); + } + + visited.add(node.getDeviceId()); + + String sql = "SELECT D.ID, D.NAME, D.DESCRIPTION, D.DEVICE_IDENTIFICATION, DT.NAME AS DEVICE_TYPE_NAME, " + + "DO.ORGANIZATION_ID, DO.TENANT_ID, DO.DEVICE_ID, DO.PARENT_DEVICE_ID, DO.DEVICE_ORGANIZATION_META ," + + "DO.LAST_UPDATED_TIMESTAMP FROM DM_DEVICE D " + + "JOIN DM_DEVICE_ORGANIZATION DO ON D.ID = DO.PARENT_DEVICE_ID " + + "JOIN DM_DEVICE_TYPE DT ON D.DEVICE_TYPE_ID = DT.ID " + + "WHERE DO.TENANT_ID = ? AND DO.DEVICE_ID = ?"; + + try (PreparedStatement stmt = conn.prepareStatement(sql)) { + stmt.setInt(1, tenantID); + stmt.setInt(2, node.getDeviceId()); + try (ResultSet rs = stmt.executeQuery()) { + DeviceNode parent; + DeviceOrganization organization; + while (rs.next()) { + parent = getDeviceFromResultSet(rs); + node.getParents().add(parent); + if (includeDevice && !childAdded) { + parentNodes.add(node); + childAdded = true; + } + + organization = loadDeviceOrganization(rs); + organizations.add(organization); + + getParentsRecursive( + parent, + (maxDepth - 1), + visited, + twiceVisited, + conn, + parentNodes, + includeDevice, + childAdded, + tenantID, + organizations); + } + } + } + } + + private DeviceNode getDeviceDetails(int deviceId, Connection conn) throws SQLException { + String sql = "SELECT D.ID, D.NAME, D.DESCRIPTION, D.DEVICE_IDENTIFICATION, DT.NAME AS DEVICE_TYPE_NAME " + + "FROM DM_DEVICE D " + + "JOIN DM_DEVICE_TYPE DT ON D.DEVICE_TYPE_ID = DT.ID " + + "WHERE D.ID = ?"; + DeviceNode node = new DeviceNode(); + try (PreparedStatement stmt = conn.prepareStatement(sql)) { + stmt.setInt(1, deviceId); + try (ResultSet rs = stmt.executeQuery()) { + if (rs.next()) { + node = getDeviceFromResultSet(rs); + } + } + } + return node; + } + + /** + * {@inheritDoc} + */ + @Override + public List getAllDeviceOrganizations() throws DeviceOrganizationMgtDAOException { + List deviceOrganizations = new ArrayList<>(); + try { + Connection conn = ConnectionManagerUtil.getDBConnection(); + String sql = "SELECT * FROM DM_DEVICE_ORGANIZATION"; + try (PreparedStatement stmt = conn.prepareStatement(sql)) { + try (ResultSet rs = stmt.executeQuery()) { + DeviceOrganization deviceOrganization; + while (rs.next()) { + deviceOrganization = loadDeviceOrganization(rs); + deviceOrganizations.add(deviceOrganization); + } + } + } + return deviceOrganizations; + } catch (DBConnectionException e) { + String msg = "Error occurred while obtaining DB connection to retrieving all device organizations details."; + log.error(msg); + throw new DeviceOrganizationMgtDAOException(msg, e); + } catch (SQLException e) { + String msg = "Error occurred while processing SQL to retrieving all device organizations."; + log.error(msg); + throw new DeviceOrganizationMgtDAOException(msg, e); + } + } + + /** + * {@inheritDoc} + */ + @Override + public List getDeviceOrganizationRoots(PaginationRequest request, int tenantID) + throws DeviceOrganizationMgtDAOException { + List deviceOrganizations = new ArrayList<>(); + try { + Connection conn = ConnectionManagerUtil.getDBConnection(); + String sql = "SELECT D.ID, D.NAME, D.DESCRIPTION, D.DEVICE_IDENTIFICATION, DT.NAME AS DEVICE_TYPE_NAME, " + + "DO.ORGANIZATION_ID, DO.TENANT_ID, DO.DEVICE_ID, DO.PARENT_DEVICE_ID, DO.DEVICE_ORGANIZATION_META ," + + "DO.LAST_UPDATED_TIMESTAMP FROM DM_DEVICE_ORGANIZATION DO JOIN DM_DEVICE D ON D.ID = DO.DEVICE_ID " + + "JOIN DM_DEVICE_TYPE DT ON D.DEVICE_TYPE_ID = DT.ID " + + "WHERE DO.TENANT_ID = ? AND (DO.PARENT_DEVICE_ID IS NULL AND " + + "DO.DEVICE_ID NOT IN " + + "(SELECT DEVICE_ID FROM DM_DEVICE_ORGANIZATION " + + "WHERE PARENT_DEVICE_ID IS NOT NULL)) " + + "LIMIT ? OFFSET ?"; + + try (PreparedStatement stmt = conn.prepareStatement(sql)) { + stmt.setInt(1, tenantID); + stmt.setInt(2, request.getLimit()); + stmt.setInt(3, request.getOffSet()); + try (ResultSet rs = stmt.executeQuery()) { + DeviceOrganization deviceOrganization; + while (rs.next()) { + deviceOrganization = loadDeviceOrganizationWithDeviceDetails(rs); + deviceOrganizations.add(deviceOrganization); + } + } + } + return deviceOrganizations; + } catch (DBConnectionException e) { + String msg = "Error occurred while obtaining DB connection to retrieving device organization root details."; + log.error(msg); + throw new DeviceOrganizationMgtDAOException(msg, e); + } catch (SQLException e) { + String msg = "Error occurred while processing SQL to retrieving device organization roots."; + log.error(msg); + throw new DeviceOrganizationMgtDAOException(msg, e); + } + } + + + /** + * {@inheritDoc} + */ + @Override + public List getDeviceOrganizationLeafs(PaginationRequest request, int tenantID) throws DeviceOrganizationMgtDAOException { + List deviceOrganizations = new ArrayList<>(); + try { + Connection conn = ConnectionManagerUtil.getDBConnection(); + String sql = "SELECT * FROM DM_DEVICE_ORGANIZATION WHERE TENANT_ID = ? AND DEVICE_ID NOT IN " + + "(SELECT DISTINCT PARENT_DEVICE_ID FROM DM_DEVICE_ORGANIZATION WHERE PARENT_DEVICE_ID IS NOT NULL ) " + + "LIMIT ? OFFSET ?"; + try (PreparedStatement stmt = conn.prepareStatement(sql)) { + stmt.setInt(1, tenantID); + stmt.setInt(2, request.getLimit()); + stmt.setInt(3, request.getOffSet()); + try (ResultSet rs = stmt.executeQuery()) { + DeviceOrganization deviceOrganization; + while (rs.next()) { + deviceOrganization = loadDeviceOrganization(rs); + deviceOrganizations.add(deviceOrganization); + } + } + } + return deviceOrganizations; + } catch (DBConnectionException e) { + String msg = "Error occurred while obtaining DB connection to retrieving all device organizations details."; + log.error(msg); + throw new DeviceOrganizationMgtDAOException(msg, e); + } catch (SQLException e) { + String msg = "Error occurred while processing SQL to retrieving all device organizations."; + log.error(msg); + throw new DeviceOrganizationMgtDAOException(msg, e); + } + } + + + /** + * {@inheritDoc} + */ + @Override + public AdditionResult addDeviceOrganization(DeviceOrganization deviceOrganization) + throws DeviceOrganizationMgtDAOException { + + AdditionResult result = new AdditionResult(); + int inserted = 0; + try { + String sql = "INSERT INTO DM_DEVICE_ORGANIZATION (TENANT_ID, DEVICE_ID, PARENT_DEVICE_ID, " + + "DEVICE_ORGANIZATION_META, LAST_UPDATED_TIMESTAMP)" + + " VALUES (?, ?, ?, ?, ?)"; + + Connection conn = ConnectionManagerUtil.getDBConnection(); + Calendar calendar = Calendar.getInstance(); + Timestamp timestamp = new Timestamp(calendar.getTime().getTime()); + try (PreparedStatement stmt = conn.prepareStatement(sql)) { + stmt.setInt(1, deviceOrganization.getTenantID()); + stmt.setInt(2, deviceOrganization.getDeviceId()); + if (deviceOrganization.getParentDeviceId() != null) { + stmt.setInt(3, deviceOrganization.getParentDeviceId()); + } else { + stmt.setNull(3, java.sql.Types.INTEGER); + } + if (deviceOrganization.getDeviceOrganizationMeta() != null) { + stmt.setString(4, deviceOrganization.getDeviceOrganizationMeta()); + } else { + stmt.setString(4, ""); + } + + stmt.setTimestamp(5, timestamp); + inserted = stmt.executeUpdate(); + + if (deviceOrganization.isCheckCyclicRelationship()) { + boolean isCyclic = isCyclicRelationshipExist(conn, + deviceOrganization.getParentDeviceId(), deviceOrganization.getTenantID()); + if (isCyclic) { + result.setCyclic(true); + return result; + } else { + if (inserted > 0) { + result.setInserted(true); + return result; + } + } + } + if (inserted > 0) { + result.setInserted(true); + } + return result; + } + } catch (DBConnectionException e) { + String msg = "Error occurred while obtaining DB connection to insert device organization for " + + deviceOrganization.getDeviceId(); + log.error(msg); + throw new DeviceOrganizationMgtDAOException(msg, e); + } catch (SQLException e) { + String msg = "Error occurred while processing SQL to insert device organization for " + + deviceOrganization.getDeviceId(); + log.error(msg); + throw new DeviceOrganizationMgtDAOException(msg, e); + } + } + /** + * Implementation for a test + * @param tenantID + * @throws DeviceOrganizationMgtDAOException + */ + + @Override + public void addAllDevices(int tenantID) throws DeviceOrganizationMgtDAOException{ + + try { + ConnectionManagerUtil.beginDBTransaction(); + + // Add devices from 1 to 500 + for (int i = 21; i <= 500; i++) { + String deviceName = "Meter_" + String.format("%04d", i); + String deviceIdentification = String.format("%04d", i); + + String query = "INSERT INTO DM_DEVICE (DESCRIPTION, NAME, DEVICE_TYPE_ID, DEVICE_IDENTIFICATION," + + " LAST_UPDATED_TIMESTAMP, TENANT_ID) VALUES (?, ?, ?, ?, CURRENT_TIMESTAMP(), ?)"; + + Connection connection = ConnectionManagerUtil.getDBConnection(); + try (PreparedStatement statement = connection.prepareStatement(query)) { + statement.setString(1, "Test Device " + i); + statement.setString(2, deviceName); + statement.setInt(3, 1); // Assuming DEVICE_TYPE_ID is 1 + statement.setString(4, deviceIdentification); + statement.setInt(5, tenantID); + + statement.executeUpdate(); + } + } + + ConnectionManagerUtil.commitDBTransaction(); + } catch (DBConnectionException | SQLException e) { + // Handle exceptions or log errors as needed + e.printStackTrace(); +// Assert.fail("Exception occurred during device addition: " + e.getMessage()); + } finally { + ConnectionManagerUtil.closeDBConnection(); + } + } + + @Override + public void addOrganizations(int tenantID, int start, int end) throws DeviceOrganizationMgtDAOException { + + for (int i = 2; i <= 500; i++) { + DeviceOrganization organization = new DeviceOrganization(); + organization.setDeviceId(i); + organization.setParentDeviceId(i - 1); + organization.setUpdateTime(new Date(System.currentTimeMillis())); + organization.setTenantID(tenantID); + + try { + ConnectionManagerUtil.beginDBTransaction(); + addDeviceOrganization(organization); + ConnectionManagerUtil.commitDBTransaction(); + } catch (DBConnectionException | DeviceOrganizationMgtDAOException e) { + // Handle exceptions or log errors as needed + e.printStackTrace(); + } finally { + ConnectionManagerUtil.closeDBConnection(); + } + } + } + + private boolean isCyclicRelationshipExist(Connection conn, Integer parentDeviceID, int tenantID) + throws DeviceOrganizationMgtDAOException { + try { + // Check for cyclic relationship + if (hasCyclicRelationship(conn, parentDeviceID, tenantID)){ + log.error("cyclic relationship detected. Insertion not allowed."); + return true; + } + return false; + } catch (SQLException e) { + String msg = "Error occurred while processing SQL to check cyclic relationship for " + + "parentDeviceID " + parentDeviceID; + log.error(msg); + throw new DeviceOrganizationMgtDAOException(msg, e); + } + } + + private boolean hasCyclicRelationship(Connection connection, Integer parentDeviceID, int tenantID) throws SQLException { + try (PreparedStatement statement = connection.prepareStatement( + "WITH RECURSIVE all_paths AS\n" + + "(" + + "SELECT DEVICE_ID AS DEVICE_ID,\n" + + "CAST(DEVICE_ID AS CHAR(500)) AS path, 0 AS is_cycle\n" + + "FROM DM_DEVICE_ORGANIZATION\n" + + "WHERE PARENT_DEVICE_ID=? AND TENANT_ID = ?\n" + + "UNION ALL\n" + + "SELECT r.DEVICE_ID,\n" + + "CONCAT(d.path, ',', r.DEVICE_ID),\n" + + "FIND_IN_SET(r.DEVICE_ID, d.path)!=0\n" + + "FROM DM_DEVICE_ORGANIZATION r, all_paths d\n" + + "WHERE r.PARENT_DEVICE_ID=d.DEVICE_ID\n" + + "AND is_cycle=0" + + ")\n" + + "SELECT\n" + + " DEVICE_ID,\n" + + " path,\n" + + " is_cycle\n" + + "FROM\n" + + " all_paths\n" + + "WHERE\n" + + " is_cycle = 1;")) { + statement.setInt(1, parentDeviceID); + statement.setInt(2, tenantID); + try (ResultSet resultSet = statement.executeQuery()) { + return resultSet.next(); + } + } + } + + /** + * {@inheritDoc} + */ + @Override + public boolean isDeviceOrganizationExist(int deviceId, Integer parentDeviceId, int tenantID) + throws DeviceOrganizationMgtDAOException { + try { + String sql; + Connection conn = ConnectionManagerUtil.getDBConnection(); + + if (parentDeviceId != null) { + sql = "SELECT * FROM DM_DEVICE_ORGANIZATION WHERE TENANT_ID = ? AND DEVICE_ID = ? AND PARENT_DEVICE_ID = ?"; + } else { + sql = "SELECT * FROM DM_DEVICE_ORGANIZATION WHERE TENANT_ID = ? AND DEVICE_ID = ? AND PARENT_DEVICE_ID IS NULL"; + } + + try (PreparedStatement stmt = conn.prepareStatement(sql)) { + stmt.setInt(1, tenantID); + stmt.setInt(2, deviceId); + if (parentDeviceId != null) { + stmt.setInt(3, parentDeviceId); + } + + try (ResultSet rs = stmt.executeQuery()) { + return rs.next(); // Returns true if a match is found, false otherwise + } + } + } catch (DBConnectionException e) { + String msg = "Error occurred while obtaining DB connection to check organization existence for deviceId " + + deviceId + " and parentDeviceId " + parentDeviceId; + log.error(msg); + throw new DeviceOrganizationMgtDAOException(msg, e); + } catch (SQLException e) { + String msg = "Error occurred while processing SQL to check organization existence for deviceId " + + deviceId + " and parentDeviceId " + parentDeviceId; + log.error(msg); + throw new DeviceOrganizationMgtDAOException(msg, e); + } + } + + /** + * {@inheritDoc} + */ + + @Override + public DeviceOrganization getDeviceOrganizationByUniqueKey(int deviceId, Integer parentDeviceId, int tenantID) + throws DeviceOrganizationMgtDAOException { + try { + String sql; + Connection conn = ConnectionManagerUtil.getDBConnection(); + + if (parentDeviceId != null) { + sql = "SELECT * FROM DM_DEVICE_ORGANIZATION WHERE TENANT_ID = ? AND DEVICE_ID = ? AND PARENT_DEVICE_ID = ?"; + } else { + sql = "SELECT * FROM DM_DEVICE_ORGANIZATION WHERE TENANT_ID = ? AND DEVICE_ID = ? AND PARENT_DEVICE_ID IS NULL"; + } + + try (PreparedStatement stmt = conn.prepareStatement(sql)) { + stmt.setInt(1, tenantID); + stmt.setInt(2, deviceId); + if (parentDeviceId != null) { + stmt.setInt(3, parentDeviceId); + } + + try (ResultSet rs = stmt.executeQuery()) { + if (rs.next()) { + return loadDeviceOrganization(rs); + } + } + } + return null; // No matching device organization found. + } catch (DBConnectionException e) { + String msg = "Error occurred while obtaining DB connection to get device organization for DEVICE_ID " + + deviceId + " and PARENT_DEVICE_ID " + parentDeviceId; + log.error(msg); + throw new DeviceOrganizationMgtDAOException(msg, e); + } catch (SQLException e) { + String msg = "Error occurred while processing SQL to get device organization for DEVICE_ID " + + deviceId + " and PARENT_DEVICE_ID " + parentDeviceId; + log.error(msg); + throw new DeviceOrganizationMgtDAOException(msg, e); + } + } + + + /** + * {@inheritDoc} + */ + @Override + public boolean updateDeviceOrganization(DeviceOrganization deviceOrganization) + throws DeviceOrganizationMgtDAOException { + String msg; + DeviceOrganization organization = getDeviceOrganizationByID(deviceOrganization.getOrganizationId(), deviceOrganization.getTenantID()); + + if (organization == null) { + msg = "Device Organization does not exist for organization ID = " + deviceOrganization.getOrganizationId(); + throw new DeviceOrganizationMgtDAOException(msg); + } + + try { + String sql = "UPDATE DM_DEVICE_ORGANIZATION SET "; + if ((organization.getDeviceId() != deviceOrganization.getDeviceId()) && deviceOrganization.getDeviceId() > 0) { + sql += "DEVICE_ID = ? , "; + } + if ((deviceOrganization.getParentDeviceId() == null || deviceOrganization.getParentDeviceId() > 0) && + !Objects.equals(organization.getParentDeviceId(), deviceOrganization.getParentDeviceId())) { + sql += "PARENT_DEVICE_ID = ? ,"; + } + if (!Objects.equals(organization.getDeviceOrganizationMeta(), deviceOrganization.getDeviceOrganizationMeta())) { + sql += "DEVICE_ORGANIZATION_META = ? ,"; + } + sql += "LAST_UPDATED_TIMESTAMP = ? WHERE ORGANIZATION_ID = ? "; + + Connection conn = ConnectionManagerUtil.getDBConnection(); + Calendar calendar = Calendar.getInstance(); + Timestamp timestamp = new Timestamp(calendar.getTime().getTime()); + try (PreparedStatement stmt = conn.prepareStatement(sql)) { + int x = 0; + + if ((organization.getDeviceId() != deviceOrganization.getDeviceId()) && deviceOrganization.getDeviceId() > 0) { + stmt.setInt(++x, deviceOrganization.getDeviceId()); + } + if (!Objects.equals(organization.getParentDeviceId(), deviceOrganization.getParentDeviceId())) { + stmt.setInt(++x, deviceOrganization.getParentDeviceId()); + } + if (!Objects.equals(organization.getDeviceOrganizationMeta(), deviceOrganization.getDeviceOrganizationMeta())) { + stmt.setString(++x, deviceOrganization.getDeviceOrganizationMeta()); + } + stmt.setTimestamp(++x, timestamp); + stmt.setInt(++x, deviceOrganization.getOrganizationId()); + return stmt.executeUpdate() > 0; + } + + } catch (DBConnectionException e) { + msg = "Error occurred while obtaining DB connection to update device organization for " + + deviceOrganization.getOrganizationId(); + log.error(msg); + throw new DeviceOrganizationMgtDAOException(msg, e); + } catch (SQLException e) { + msg = "Error occurred while processing SQL to update device organization for " + + deviceOrganization.getOrganizationId(); + log.error(msg); + throw new DeviceOrganizationMgtDAOException(msg, e); + } + } + + /** + * {@inheritDoc} + */ + @Override + public DeviceOrganization getDeviceOrganizationByID(int organizationId, int tenantID) throws DeviceOrganizationMgtDAOException { + try { + Connection conn = ConnectionManagerUtil.getDBConnection(); + String sql = "SELECT * FROM DM_DEVICE_ORGANIZATION DO WHERE DO.TENANT_ID = ? AND DO.ORGANIZATION_ID = ? "; + + try (PreparedStatement stmt = conn.prepareStatement(sql)) { + stmt.setInt(1, tenantID); + stmt.setInt(2, organizationId); + try (ResultSet rs = stmt.executeQuery()) { + if (rs.next()) { + return loadDeviceOrganization(rs); + } + log.info("No Device Organization found for retrieving for organizationID = " + organizationId); + return null; + } + } + + } catch (DBConnectionException e) { + String msg = "Error occurred while obtaining DB connection to get device organization details for " + + "organizationID = " + organizationId; + log.error(msg); + throw new DeviceOrganizationMgtDAOException(msg, e); + } catch (SQLException e) { + String msg = "Error occurred while processing SQL to get device organization details for " + + "organizationID = " + organizationId; + log.error(msg); + throw new DeviceOrganizationMgtDAOException(msg, e); + } + } + + /** + * {@inheritDoc} + */ + @Override + public boolean deleteDeviceOrganizationByUniqueKey(int deviceId, Integer parentDeviceId, int tenantID) throws DeviceOrganizationMgtDAOException { + try { + Connection conn = ConnectionManagerUtil.getDBConnection(); + String deleteOrganizationSql = "DELETE FROM DM_DEVICE_ORGANIZATION WHERE TENANT_ID = ? AND DEVICE_ID = ? AND PARENT_DEVICE_ID = ?"; + + try (PreparedStatement deleteOrgStmt = conn.prepareStatement(deleteOrganizationSql)) { + + // Delete the organization + deleteOrgStmt.setInt(1, tenantID); + deleteOrgStmt.setInt(2, deviceId); + deleteOrgStmt.setInt(3, parentDeviceId); + return deleteOrgStmt.executeUpdate() > 0; + } + + } catch (DBConnectionException e) { + String msg = "Error occurred while obtaining DB connection to delete device organization for " + + "tenantID = " + tenantID +", deviceId = " + deviceId + "and parentDeviceId = " + parentDeviceId; + log.error(msg); + throw new DeviceOrganizationMgtDAOException(msg, e); + } catch (SQLException e) { + String msg = "Error occurred while obtaining DB connection to delete device organization for " + + "tenantID = " + tenantID +", deviceId = " + deviceId + "and parentDeviceId = " + parentDeviceId; + log.error(msg); + throw new DeviceOrganizationMgtDAOException(msg, e); + } + } + + /** + * {@inheritDoc} + */ + @Override + public boolean deleteDeviceOrganizationByID(int organizationId, int tenantID) throws DeviceOrganizationMgtDAOException { + try { + Connection conn = ConnectionManagerUtil.getDBConnection(); + String deleteOrganizationSql = "DELETE FROM DM_DEVICE_ORGANIZATION WHERE TENANT_ID = ? AND ORGANIZATION_ID = ?"; + + try (PreparedStatement deleteOrgStmt = conn.prepareStatement(deleteOrganizationSql)) { + + // Delete the organization + deleteOrgStmt.setInt(1, tenantID); + deleteOrgStmt.setInt(2, organizationId); + return deleteOrgStmt.executeUpdate() > 0; + } + + } catch (DBConnectionException e) { + String msg = "Error occurred while obtaining DB connection to delete device organization for " + + organizationId; + log.error(msg); + throw new DeviceOrganizationMgtDAOException(msg, e); + } catch (SQLException e) { + String msg = "Error occurred while processing SQL to delete device organization details for " + + organizationId; + log.error(msg); + throw new DeviceOrganizationMgtDAOException(msg, e); + } + } + + /** + * {@inheritDoc} + */ + @Override + public boolean deleteDeviceAssociations(int deviceId, int tenantID) throws DeviceOrganizationMgtDAOException { + try { + Connection conn = ConnectionManagerUtil.getDBConnection(); + String deleteByDeviceIdSql = "DELETE FROM DM_DEVICE_ORGANIZATION WHERE TENANT_ID = ? AND DEVICE_ID = ?"; + String deleteByParentDeviceIdSql = "DELETE FROM DM_DEVICE_ORGANIZATION WHERE TENANT_ID = ? AND PARENT_DEVICE_ID = ?"; + + try (PreparedStatement deleteByDeviceIdStmt = conn.prepareStatement(deleteByDeviceIdSql); + PreparedStatement deleteByParentDeviceIdStmt = conn.prepareStatement(deleteByParentDeviceIdSql)) { + + // Delete device organizations where the device is the device_id + deleteByDeviceIdStmt.setInt(1, tenantID); + deleteByDeviceIdStmt.setInt(2, deviceId); + + // Delete device organizations where the device is the parent_device_id + deleteByParentDeviceIdStmt.setInt(1, tenantID); + deleteByParentDeviceIdStmt.setInt(2, deviceId); + + return deleteByDeviceIdStmt.executeUpdate() > 0 | deleteByParentDeviceIdStmt.executeUpdate() > 0; + + } + } catch (DBConnectionException e) { + String msg = "Error occurred while obtaining DB connection to delete device organization for device ID" + + deviceId; + log.error(msg); + throw new DeviceOrganizationMgtDAOException(msg, e); + } catch (SQLException e) { + String msg = "Error occurred while processing SQL to delete device organization details for device ID " + + deviceId; + log.error(msg); + throw new DeviceOrganizationMgtDAOException(msg, e); + } + } + + /** + * {@inheritDoc} + */ + @Override + public boolean isDeviceIdExist(int deviceId, int tenantID) throws DeviceOrganizationMgtDAOException { + try { + Connection conn = ConnectionManagerUtil.getDBConnection(); + String sql = "SELECT 1 " + + "FROM DM_DEVICE_ORGANIZATION " + + "WHERE TENANT_ID = ? AND (device_id = ? OR parent_device_id = ?) " + + "LIMIT 1"; + + try (PreparedStatement stmt = conn.prepareStatement(sql)) { + stmt.setInt(1, tenantID); + stmt.setInt(2, deviceId); + stmt.setInt(3, deviceId); + + try (ResultSet rs = stmt.executeQuery()) { + return rs.next(); // Returns true if a match is found, false otherwise + } + } + } catch (DBConnectionException e) { + String msg = "Error occurred while obtaining DB connection to query device organization for device ID" + + deviceId; + log.error(msg); + throw new DeviceOrganizationMgtDAOException(msg, e); + } catch (SQLException e) { + String msg = "Error occurred while processing SQL to query device organization details for device ID " + + deviceId; + log.error(msg); + throw new DeviceOrganizationMgtDAOException(msg, e); + } + } + + /** + * {@inheritDoc} + */ + @Override + public boolean isChildDeviceIdExist(int deviceId, int tenantID) throws DeviceOrganizationMgtDAOException { + try { + Connection conn = ConnectionManagerUtil.getDBConnection(); + String sql = "SELECT 1 " + + "FROM DM_DEVICE_ORGANIZATION " + + "WHERE TENANT_ID = ? AND device_id = ? " + + "LIMIT 1"; + + try (PreparedStatement stmt = conn.prepareStatement(sql)) { + stmt.setInt(1, tenantID); + stmt.setInt(2, deviceId); + + try (ResultSet rs = stmt.executeQuery()) { + return rs.next(); // Returns true if a match is found, false otherwise + } + } + } catch (DBConnectionException e) { + String msg = "Error occurred while obtaining DB connection to query device organization for device ID" + + deviceId; + log.error(msg); + throw new DeviceOrganizationMgtDAOException(msg, e); + } catch (SQLException e) { + String msg = "Error occurred while processing SQL to query device organization details for device ID " + + deviceId; + log.error(msg); + throw new DeviceOrganizationMgtDAOException(msg, e); + } + } + + +} diff --git a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/main/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/dao/util/ConnectionManagerUtil.java b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/main/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/dao/util/ConnectionManagerUtil.java new file mode 100644 index 0000000000..ebecdeb063 --- /dev/null +++ b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/main/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/dao/util/ConnectionManagerUtil.java @@ -0,0 +1,288 @@ +/* + * Copyright (c) 2018 - 2023, 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.device.mgt.extensions.device.organization.dao.util; + +import io.entgra.device.mgt.core.device.mgt.common.exceptions.IllegalTransactionStateException; +import io.entgra.device.mgt.core.device.mgt.core.config.datasource.DataSourceConfig; +import io.entgra.device.mgt.core.device.mgt.core.config.datasource.JNDILookupDefinition; +import io.entgra.device.mgt.core.device.mgt.extensions.device.organization.exception.DBConnectionException; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import javax.naming.InitialContext; +import javax.sql.DataSource; +import java.sql.Connection; +import java.sql.SQLException; +import java.util.Hashtable; +import java.util.List; + +/** + * Utility class for managing database connections. + */ +public class ConnectionManagerUtil { + + private static final Log log = LogFactory.getLog(ConnectionManagerUtil.class); + private static final ThreadLocal currentConnection = new ThreadLocal<>(); + private static DataSource dataSource; + + /** + * Opens a database connection. + * + * @throws DBConnectionException If an error occurs while opening the connection. + */ + public static void openDBConnection() throws DBConnectionException { + Connection conn = currentConnection.get(); + if (conn != null) { + throw new IllegalTransactionStateException("Database connection has already been obtained."); + } + try { + conn = dataSource.getConnection(); + } catch (SQLException e) { + throw new DBConnectionException("Failed to get a database connection.", e); + } + currentConnection.set(conn); + } + + /** + * Gets a database connection. + * + * @return The database connection. + * @throws DBConnectionException If an error occurs while getting the connection. + */ + public static Connection getDBConnection() throws DBConnectionException { + Connection conn = currentConnection.get(); + if (conn == null) { + try { + conn = dataSource.getConnection(); + currentConnection.set(conn); + } catch (SQLException e) { + throw new DBConnectionException("Failed to get database connection.", e); + } + } + return conn; + } + + /** + * Begins a new database transaction. + * + * @throws DBConnectionException If an error occurs while starting the transaction. + */ + public static Connection beginDBTransaction() throws DBConnectionException { + Connection conn = currentConnection.get(); + if (conn == null) { + conn = getDBConnection(); + } else if (inTransaction(conn)) { + throw new IllegalTransactionStateException("Transaction has already been started."); + } + + try { + conn.setAutoCommit(false); + } catch (SQLException e) { + throw new DBConnectionException("Error occurred while starting a database transaction.", e); + } + + return conn; + } + + /** + * Ends the current database transaction by setting auto-commit mode to true. + * + * @throws DBConnectionException If an error occurs while ending the transaction. + * @throws IllegalTransactionStateException If there is no active transaction to end. + */ + public static void endDBTransaction() throws DBConnectionException { + Connection conn = currentConnection.get(); + if (conn == null) { + throw new IllegalTransactionStateException("Database connection is not active."); + } + + if (!inTransaction(conn)) { + throw new IllegalTransactionStateException("Transaction has not been started."); + } + + try { + conn.setAutoCommit(true); + } catch (SQLException e) { + throw new DBConnectionException("Error occurred while ending database transaction.", e); + } + } + + /** + * Commits the current database transaction. + * + * @throws IllegalTransactionStateException If there is no active transaction to commit. + */ + public static void commitDBTransaction() { + Connection conn = currentConnection.get(); + if (conn == null) { + throw new IllegalTransactionStateException("Database connection is not active."); + } + + if (!inTransaction(conn)) { + throw new IllegalTransactionStateException("Transaction has not been started."); + } + + try { + conn.commit(); + } catch (SQLException e) { + log.error("Error occurred while committing the transaction", e); + } + } + + /** + * Rolls back the current database transaction. + * + * @throws IllegalTransactionStateException If there is no active transaction to roll back. + */ + public static void rollbackDBTransaction() { + Connection conn = currentConnection.get(); + if (conn == null) { + throw new IllegalTransactionStateException("Database connection is not active."); + } + + if (!inTransaction(conn)) { + throw new IllegalTransactionStateException("Transaction has not been started."); + } + + try { + conn.rollback(); + } catch (SQLException e) { + log.warn("Error occurred while roll-backing the transaction", e); + } + } + + /** + * Closes the current database connection and removes it from the thread-local context. + * + * @throws IllegalTransactionStateException If there is no active database connection to close. + */ + public static void closeDBConnection() { + Connection conn = currentConnection.get(); + if (conn == null) { + throw new IllegalTransactionStateException("Database connection is not active."); + } + try { + conn.close(); + } catch (SQLException e) { + log.error("Error occurred while closing the connection", e); + } + currentConnection.remove(); + } + + /** + * Checks if the provided database connection is currently in a transaction. + * + * @param conn The database connection to check. + * @return True if the connection is in a transaction, false otherwise. + * @throws IllegalTransactionStateException If there is an issue checking the transaction state. + */ + private static boolean inTransaction(Connection conn) { + boolean inTransaction = true; + try { + if (conn.getAutoCommit()) { + inTransaction = false; + } + } catch (SQLException e) { + throw new IllegalTransactionStateException("Failed to get transaction state."); + } + return inTransaction; + } + + /** + * Checks if a transaction has been started on the current database connection. + * + * @return True if a transaction has been started, false otherwise. + * @throws DBConnectionException If there is an issue obtaining a database connection. + */ + public static boolean isTransactionStarted() throws DBConnectionException { + Connection connection = getDBConnection(); + return inTransaction(connection); + } + + /** + * Resolve a data source from the given data source configuration. + * + * @param config Data source configuration. + * @return A data source resolved based on the configuration. + * @throws RuntimeException If the data source configuration is null and not initialized. + */ + public static DataSource resolveDataSource(DataSourceConfig config) { + if (config == null) { + throw new RuntimeException("Device Management Repository data source configuration " + + "is null and thus, is not initialized"); + } + JNDILookupDefinition jndiConfig = config.getJndiLookupDefinition(); + if (jndiConfig != null) { + if (log.isDebugEnabled()) { + log.debug("Initializing Device Management Repository data source using the JNDI " + + "Lookup Definition"); + } + List jndiPropertyList = + jndiConfig.getJndiProperties(); + if (jndiPropertyList != null) { + Hashtable jndiProperties = new Hashtable<>(); + for (JNDILookupDefinition.JNDIProperty prop : jndiPropertyList) { + jndiProperties.put(prop.getName(), prop.getValue()); + } + dataSource = ConnectionManagerUtil.lookupDataSource(jndiConfig.getJndiName(), jndiProperties); + } else { + dataSource = ConnectionManagerUtil.lookupDataSource(jndiConfig.getJndiName(), null); + } + } + return dataSource; + } + + /** + * Lookup a data source using the given data source name and JNDI properties. + * + * @param dataSourceName The JNDI name of the data source to lookup. + * @param jndiProperties Optional JNDI properties used for the lookup. + * @return A data source object representing the looked-up data source. + * @throws RuntimeException If an error occurs during the lookup process. + */ + public static DataSource lookupDataSource(String dataSourceName, + final Hashtable jndiProperties) { + + try { + if (jndiProperties == null || jndiProperties.isEmpty()) { + return (DataSource) InitialContext.doLookup(dataSourceName); + } + final InitialContext context = new InitialContext(jndiProperties); + return (DataSource) context.lookup(dataSourceName); + } catch (Exception e) { + String msg = "Error in looking up data source: " + e.getMessage(); + log.error(msg, e); + throw new RuntimeException(msg + e.getMessage(), e); + } + } + + /** + * Get the name of the database product to which the current connection belongs. + * + * @return A string representing the name of the database product. + * Returns null if an error occurs during the retrieval process. + */ + public static String getDatabaseType() { + try { + return dataSource.getConnection().getMetaData().getDatabaseProductName(); + } catch (SQLException e) { + log.error("Error occurred while retrieving config.datasource connection", e); + } + return null; + } +} diff --git a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/main/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/dao/util/DeviceOrganizationDaoUtil.java b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/main/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/dao/util/DeviceOrganizationDaoUtil.java new file mode 100644 index 0000000000..e1e972b226 --- /dev/null +++ b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/main/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/dao/util/DeviceOrganizationDaoUtil.java @@ -0,0 +1,100 @@ +/* + * Copyright (c) 2018 - 2023, 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.device.mgt.extensions.device.organization.dao.util; + + +import io.entgra.device.mgt.core.device.mgt.common.Device; +import io.entgra.device.mgt.core.device.mgt.extensions.device.organization.dto.DeviceNode; +import io.entgra.device.mgt.core.device.mgt.extensions.device.organization.dto.DeviceOrganization; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import java.sql.ResultSet; +import java.sql.SQLException; + +/** + * This class includes the utility methods required by DeviceOrganizationMgt functionalities. + */ +public class DeviceOrganizationDaoUtil { + + private static final Log log = LogFactory.getLog(DeviceOrganizationDaoUtil.class); + + /** + * Helper method to create a Device Organization object from a ResultSet + * + * @param rs The ResultSet containing the organization data. + * @return A DeviceOrganization object. + * @throws SQLException If there's an issue reading data from the ResultSet. + */ + public static DeviceOrganization loadDeviceOrganization(ResultSet rs) throws SQLException { + DeviceOrganization deviceOrganization = new DeviceOrganization(); + deviceOrganization.setOrganizationId(rs.getInt("ORGANIZATION_ID")); + deviceOrganization.setTenantID(rs.getInt("TENANT_ID")); + deviceOrganization.setDeviceId(rs.getInt("DEVICE_ID")); + if (rs.getInt("PARENT_DEVICE_ID") != 0) { + deviceOrganization.setParentDeviceId(rs.getInt("PARENT_DEVICE_ID")); + } else { + deviceOrganization.setParentDeviceId(null); + } + deviceOrganization.setDeviceOrganizationMeta(rs.getString("DEVICE_ORGANIZATION_META")); + deviceOrganization.setUpdateTime(rs.getDate("LAST_UPDATED_TIMESTAMP")); + return deviceOrganization; + } + + public static DeviceOrganization loadDeviceOrganizationWithDeviceDetails(ResultSet rs) throws SQLException { + DeviceOrganization deviceOrganization = new DeviceOrganization(); + deviceOrganization.setOrganizationId(rs.getInt("ORGANIZATION_ID")); + deviceOrganization.setTenantID(rs.getInt("TENANT_ID")); + deviceOrganization.setDeviceId(rs.getInt("DEVICE_ID")); + if (rs.getInt("PARENT_DEVICE_ID") != 0) { + deviceOrganization.setParentDeviceId(rs.getInt("PARENT_DEVICE_ID")); + } else { + deviceOrganization.setParentDeviceId(null); + } + deviceOrganization.setDeviceOrganizationMeta(rs.getString("DEVICE_ORGANIZATION_META")); + deviceOrganization.setUpdateTime(rs.getDate("LAST_UPDATED_TIMESTAMP")); + deviceOrganization.setDevice(getDeviceDetails(rs)); + return deviceOrganization; + } + + /** + * Helper method to create a DeviceNode object from a ResultSet + * + * @param rs The ResultSet containing device data. + * @return A DeviceNode object. + * @throws SQLException If there's an issue reading data from the ResultSet. + */ + public static DeviceNode getDeviceFromResultSet(ResultSet rs) throws SQLException { + DeviceNode node = new DeviceNode(); + node.setDeviceId(rs.getInt("ID")); + node.setDevice(getDeviceDetails(rs)); + return node; + } + + public static Device getDeviceDetails(ResultSet rs) throws SQLException { + Device device = new Device(); + device.setId(rs.getInt("ID")); + device.setDescription(rs.getString("DESCRIPTION")); + device.setName(rs.getString("NAME")); + device.setType(rs.getString("DEVICE_TYPE_NAME")); + device.setDeviceIdentifier(rs.getString("DEVICE_IDENTIFICATION")); + return device; + } + +} diff --git a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/main/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/dto/AdditionResult.java b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/main/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/dto/AdditionResult.java new file mode 100644 index 0000000000..dbebff85d6 --- /dev/null +++ b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/main/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/dto/AdditionResult.java @@ -0,0 +1,23 @@ +package io.entgra.device.mgt.core.device.mgt.extensions.device.organization.dto; + +public class AdditionResult { + + private boolean isCyclic; + private boolean isInserted; + + public boolean isCyclic() { + return isCyclic; + } + + public void setCyclic(boolean cyclic) { + isCyclic = cyclic; + } + + public boolean isInserted() { + return isInserted; + } + + public void setInserted(boolean inserted) { + isInserted = inserted; + } +} diff --git a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/main/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/dto/DeviceNode.java b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/main/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/dto/DeviceNode.java new file mode 100644 index 0000000000..3ec106543e --- /dev/null +++ b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/main/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/dto/DeviceNode.java @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2018 - 2023, 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.device.mgt.extensions.device.organization.dto; + +import io.entgra.device.mgt.core.device.mgt.common.Device; + +import java.util.ArrayList; +import java.util.List; + +/** + * This class represents a node in a device hierarchy used in various organizational structures, + * including hierarchical organizations, sequential organizations, multiple root organizations, + * and multiple child organizations. + */ +public class DeviceNode { + + private int deviceId; + private Device device; + private List parents = new ArrayList<>(); + private List children = new ArrayList<>(); + + public int getDeviceId() { + return deviceId; + } + + public void setDeviceId(int deviceId) { + this.deviceId = deviceId; + } + + public Device getDevice() { + return device; + } + + public void setDevice(Device device) { + this.device = device; + } + + public List getParents() { + return parents; + } + + public void setParents(List parents) { + this.parents = parents; + } + + public List getChildren() { + return children; + } + + public void setChildren(List children) { + this.children = children; + } +} diff --git a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/main/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/dto/DeviceNodeResult.java b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/main/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/dto/DeviceNodeResult.java new file mode 100644 index 0000000000..94673c84d3 --- /dev/null +++ b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/main/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/dto/DeviceNodeResult.java @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2018 - 2023, 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.device.mgt.extensions.device.organization.dto; + +import java.util.List; +import java.util.Set; + +public class DeviceNodeResult { + + private List nodes; + private Set edges; + + public DeviceNodeResult(List nodes, Set edges) { + this.nodes = nodes; + this.edges = edges; + } + + public List getNodes() { + return nodes; + } + + public Set getEdges() { + return edges; + } + +} diff --git a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/main/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/dto/DeviceOrganization.java b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/main/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/dto/DeviceOrganization.java new file mode 100644 index 0000000000..ea912a9611 --- /dev/null +++ b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/main/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/dto/DeviceOrganization.java @@ -0,0 +1,123 @@ +/* + * Copyright (c) 2018 - 2023, 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.device.mgt.extensions.device.organization.dto; + + +import io.entgra.device.mgt.core.device.mgt.common.Device; + +import java.util.Date; +import java.util.Objects; + +/** + * This abstract class represents a device organization entity used in DeviceOrganizationService. + * It serves as a base class for defining various organizational structures related to devices. + */ +public class DeviceOrganization { + + private int organizationId; + private int deviceId; + private Device device; + private Integer parentDeviceId; + private String deviceOrganizationMeta; + private Date updateTime; + private int tenantID; + private boolean isCheckCyclicRelationship; + + public int getOrganizationId() { + return organizationId; + } + + public void setOrganizationId(int organizationId) { + this.organizationId = organizationId; + } + + public int getDeviceId() { + return deviceId; + } + + public void setDeviceId(int deviceId) { + this.deviceId = deviceId; + } + + public Device getDevice() { + return device; + } + public void setDevice(Device device) { + this.device = device; + } + + public Integer getParentDeviceId() { + return parentDeviceId; + } + + public void setParentDeviceId(Integer parentDeviceId) { + this.parentDeviceId = parentDeviceId; + } + + public String getDeviceOrganizationMeta() { + return deviceOrganizationMeta; + } + + public void setDeviceOrganizationMeta(String deviceOrganizationMeta) { + this.deviceOrganizationMeta = deviceOrganizationMeta; + } + + public Date getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } + + public int getTenantID() { + return tenantID; + } + + public void setTenantID(int tenantID) { + this.tenantID = tenantID; + } + + public boolean isCheckCyclicRelationship() { + return isCheckCyclicRelationship; + } + + public void setCheckCyclicRelationship(boolean checkCyclicRelationship) { + isCheckCyclicRelationship = checkCyclicRelationship; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + DeviceOrganization that = (DeviceOrganization) o; + // Compare fields for equality + return Objects.equals(organizationId, that.organizationId) + && Objects.equals(tenantID, that.tenantID) + && Objects.equals(deviceId, that.deviceId) + && Objects.equals(parentDeviceId, that.parentDeviceId) + && Objects.equals(deviceOrganizationMeta, that.deviceOrganizationMeta); + } + + @Override + public int hashCode() { + // Hash based on fields + return Objects.hash(organizationId, tenantID, deviceId, parentDeviceId, deviceOrganizationMeta); + } +} diff --git a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/main/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/dto/PaginationRequest.java b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/main/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/dto/PaginationRequest.java new file mode 100644 index 0000000000..18db134545 --- /dev/null +++ b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/main/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/dto/PaginationRequest.java @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2018 - 2023, 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.device.mgt.extensions.device.organization.dto; + +/** + * This class holds required parameters for a querying a paginated device response. + */ +public class PaginationRequest { + + private int offSet; + private int limit; + + public PaginationRequest(int start, int limit) { + this.offSet = start; + this.limit = limit; + } + + public int getOffSet() { + return offSet; + } + + public void setOffSet(int offSet) { + this.offSet = offSet; + } + + public int getLimit() { + return limit; + } + + public void setLimit(int limit) { + this.limit = limit; + } + + public boolean validatePaginationRequest(int offSet, int limit) { + if (offSet < 0) { + throw new IllegalArgumentException("off set value can't be negative"); + } else if (limit < 0) { + throw new IllegalArgumentException("limit value can't be negative"); + } else { + return true; + } + } + + @Override + public String toString() { + return "Off Set'" + this.offSet + "' row count '" + this.limit; + } +} diff --git a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/main/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/exception/BadRequestDaoException.java b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/main/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/exception/BadRequestDaoException.java new file mode 100644 index 0000000000..dee4e83d6b --- /dev/null +++ b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/main/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/exception/BadRequestDaoException.java @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2018 - 2023, 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.device.mgt.extensions.device.organization.exception; + +/** + * This exception is thrown when a bad request is encountered in the Device Organization Management DAO layer. + * It typically indicates issues with the input parameters or data during DAO operations. + */ +public class BadRequestDaoException extends DeviceOrganizationMgtDAOException { + + private static final long serialVersionUID = -6275360486437601206L; + + public BadRequestDaoException(String message) { + super(message); + } + + public BadRequestDaoException(String message, Throwable cause) { + super(message, cause); + } +} diff --git a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/main/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/exception/BadRequestException.java b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/main/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/exception/BadRequestException.java new file mode 100644 index 0000000000..0a87897426 --- /dev/null +++ b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/main/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/exception/BadRequestException.java @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2018 - 2023, 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.device.mgt.extensions.device.organization.exception; + +/** + * Represents an exception thrown during the validation of a request in the Device Organization + * Management Plugin. This exception is typically thrown when the request parameters or + * data are invalid or do not meet the required criteria. + */ +public class BadRequestException extends DeviceOrganizationMgtPluginException { + private static final long serialVersionUID = -2036794959420530981L; + + public BadRequestException(String message, Throwable ex) { + super(message, ex); + } + + public BadRequestException(String message) { + super(message); + } +} diff --git a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/main/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/exception/DBConnectionException.java b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/main/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/exception/DBConnectionException.java new file mode 100644 index 0000000000..69818565ae --- /dev/null +++ b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/main/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/exception/DBConnectionException.java @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2018 - 2023, 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.device.mgt.extensions.device.organization.exception; + +/** + * Exception thrown due to Database Connection issues. + * This exception is typically thrown when there are problems establishing or maintaining a + * database connection. + */ +public class DBConnectionException extends Exception { + private static final long serialVersionUID = 8485257804482934068L; + + /** + * Constructs a new `DBConnectionException` with the specified detail message and a cause. + * + * @param message The detail message that describes the exception. + * @param cause The cause of the exception. + */ + public DBConnectionException(String message, Throwable cause) { + super(message, cause); + } + + /** + * Constructs a new `DBConnectionException` with the specified detail message. + * + * @param msg The detail message that describes the exception. + */ + public DBConnectionException(String msg) { + super(msg); + } +} diff --git a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/main/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/exception/DeviceOrganizationMgtDAOException.java b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/main/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/exception/DeviceOrganizationMgtDAOException.java new file mode 100644 index 0000000000..2f728aa833 --- /dev/null +++ b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/main/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/exception/DeviceOrganizationMgtDAOException.java @@ -0,0 +1,97 @@ +/* + * Copyright (c) 2018 - 2023, 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.device.mgt.extensions.device.organization.exception; + +/** + * Exception thrown during the DeviceOrganization Management DAO operations. + * This exception is typically used to handle errors related to DeviceOrganization management + * data access operations. + */ +public class DeviceOrganizationMgtDAOException extends Exception { + private static final long serialVersionUID = 2412162605436684110L; + private String errorMessage; + + /** + * Constructs a new `DeviceOrganizationMgtDAOException` without a specified detail message. + */ + public DeviceOrganizationMgtDAOException() { + super(); + } + + + /** + * Constructs a new `DeviceOrganizationMgtDAOException` with a specified cause. + * + * @param cause The cause of the exception. + */ + public DeviceOrganizationMgtDAOException(Throwable cause) { + super(cause); + } + + /** + * Constructs a new `DeviceOrganizationMgtDAOException` with a specified detail message and a nested exception. + * + * @param msg The detail message that describes the exception. + * @param nestedEx The nested exception. + */ + public DeviceOrganizationMgtDAOException(String msg, Exception nestedEx) { + super(msg, nestedEx); + setErrorMessage(msg); + } + + /** + * Constructs a new `DeviceOrganizationMgtDAOException` with a specified detail message and a cause. + * + * @param message The detail message that describes the exception. + * @param cause The cause of the exception. + */ + public DeviceOrganizationMgtDAOException(String message, Throwable cause) { + super(message, cause); + setErrorMessage(message); + } + + /** + * Constructs a new `DeviceOrganizationMgtDAOException` with a specified detail message. + * + * @param msg The detail message that describes the exception. + */ + public DeviceOrganizationMgtDAOException(String msg) { + super(msg); + setErrorMessage(msg); + } + + /** + * Get the error message associated with this exception. + * + * @return The error message. + */ + public String getErrorMessage() { + return errorMessage; + } + + /** + * Set the error message for this exception. + * + * @param errorMessage The error message. + */ + public void setErrorMessage(String errorMessage) { + this.errorMessage = errorMessage; + } +} + diff --git a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/main/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/exception/DeviceOrganizationMgtPluginException.java b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/main/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/exception/DeviceOrganizationMgtPluginException.java new file mode 100644 index 0000000000..98a95e4d41 --- /dev/null +++ b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/main/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/exception/DeviceOrganizationMgtPluginException.java @@ -0,0 +1,98 @@ +/* + * Copyright (c) 2018 - 2023, 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.device.mgt.extensions.device.organization.exception; + +/** + * Exception thrown during the DeviceOrganization Management operations. + * This exception is typically used to handle errors related to DeviceOrganization management operations. + */ +public class DeviceOrganizationMgtPluginException extends Exception { + + private static final long serialVersionUID = -7686100672332447443L; + + private String errorMessage; + + /** + * Constructs a new `DeviceOrganizationMgtPluginException` without a specified detail message. + */ + public DeviceOrganizationMgtPluginException() { + super(); + } + + /** + * Constructs a new `DeviceOrganizationMgtPluginException` with a specified cause. + * + * @param cause The cause of the exception. + */ + public DeviceOrganizationMgtPluginException(Throwable cause) { + super(cause); + } + + + /** + * Constructs a new `DeviceOrganizationMgtPluginException` with a specified detail message and a nested exception. + * + * @param msg The detail message that describes the exception. + * @param nestedEx The nested exception. + */ + public DeviceOrganizationMgtPluginException(String msg, Exception nestedEx) { + super(msg, nestedEx); + setErrorMessage(msg); + } + + /** + * Constructs a new `DeviceOrganizationMgtPluginException` with a specified detail message and a cause. + * + * @param message The detail message that describes the exception. + * @param cause The cause of the exception. + */ + public DeviceOrganizationMgtPluginException(String message, Throwable cause) { + super(message, cause); + setErrorMessage(message); + } + + /** + * Constructs a new `DeviceOrganizationMgtPluginException` with a specified detail message. + * + * @param msg The detail message that describes the exception. + */ + public DeviceOrganizationMgtPluginException(String msg) { + super(msg); + setErrorMessage(msg); + } + + /** + * Get the error message associated with this exception. + * + * @return The error message. + */ + public String getErrorMessage() { + return errorMessage; + } + + /** + * Set the error message for this exception. + * + * @param errorMessage The error message. + */ + public void setErrorMessage(String errorMessage) { + this.errorMessage = errorMessage; + } + +} diff --git a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/main/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/exception/UnsupportedDatabaseEngineException.java b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/main/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/exception/UnsupportedDatabaseEngineException.java new file mode 100644 index 0000000000..32c9ed3ac2 --- /dev/null +++ b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/main/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/exception/UnsupportedDatabaseEngineException.java @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2018 - 2023, 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.device.mgt.extensions.device.organization.exception; + +/** + * This runtime exception will be thrown if the server has configured with unsupported DB engine. + */ +public class UnsupportedDatabaseEngineException extends RuntimeException { + + private static final long serialVersionUID = -3151279311929070297L; + + public UnsupportedDatabaseEngineException(String msg, Exception nestedEx) { + super(msg, nestedEx); + } + + public UnsupportedDatabaseEngineException(String message, Throwable cause) { + super(message, cause); + } + + public UnsupportedDatabaseEngineException(String msg) { + super(msg); + } + +} diff --git a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/main/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/impl/DeviceOrganizationServiceImpl.java b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/main/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/impl/DeviceOrganizationServiceImpl.java new file mode 100644 index 0000000000..1cc4838d97 --- /dev/null +++ b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/main/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/impl/DeviceOrganizationServiceImpl.java @@ -0,0 +1,637 @@ +/* + * Copyright (c) 2018 - 2023, 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.device.mgt.extensions.device.organization.impl; + +import io.entgra.device.mgt.core.device.mgt.extensions.device.organization.dao.DeviceOrganizationDAO; +import io.entgra.device.mgt.core.device.mgt.extensions.device.organization.dao.DeviceOrganizationDAOFactory; +import io.entgra.device.mgt.core.device.mgt.extensions.device.organization.dao.util.ConnectionManagerUtil; +import io.entgra.device.mgt.core.device.mgt.extensions.device.organization.dto.AdditionResult; +import io.entgra.device.mgt.core.device.mgt.extensions.device.organization.dto.DeviceNodeResult; +import io.entgra.device.mgt.core.device.mgt.extensions.device.organization.dto.DeviceOrganization; +import io.entgra.device.mgt.core.device.mgt.extensions.device.organization.dto.PaginationRequest; +import io.entgra.device.mgt.core.device.mgt.extensions.device.organization.exception.BadRequestException; +import io.entgra.device.mgt.core.device.mgt.extensions.device.organization.exception.DBConnectionException; +import io.entgra.device.mgt.core.device.mgt.extensions.device.organization.exception.DeviceOrganizationMgtDAOException; +import io.entgra.device.mgt.core.device.mgt.extensions.device.organization.exception.DeviceOrganizationMgtPluginException; +import io.entgra.device.mgt.core.device.mgt.extensions.device.organization.spi.DeviceOrganizationService; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.wso2.carbon.context.PrivilegedCarbonContext; + +import java.sql.Connection; +import java.util.List; + +public class DeviceOrganizationServiceImpl implements DeviceOrganizationService { + + private static final Log log = LogFactory.getLog(DeviceOrganizationServiceImpl.class); + + private final DeviceOrganizationDAO deviceOrganizationDao; + + public DeviceOrganizationServiceImpl() { + this.deviceOrganizationDao = DeviceOrganizationDAOFactory.getDeviceOrganizationDAO(); + } + + /** + * {@inheritDoc} + */ + @Override + public DeviceNodeResult getChildrenOfDeviceNode(int deviceId, int maxDepth, boolean includeDevice) + throws DeviceOrganizationMgtPluginException { + if (deviceId <= 0 || maxDepth < 0) { + String msg = "Invalid input parameters for retrieving child devices : " + + "deviceID = " + deviceId + ", maxDepth = " + maxDepth + + ", includeDevice = " + includeDevice; + throw new BadRequestException(msg); + } + try { + // Open a database connection + ConnectionManagerUtil.openDBConnection(); + //set device details + int tenantID = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(); + return deviceOrganizationDao.getChildrenOfDeviceNode(deviceId, maxDepth, includeDevice, tenantID); + } catch (DBConnectionException e) { + String msg = "Error occurred while obtaining the database connection to retrieve child devices : " + + "deviceID = " + deviceId + ", maxDepth = " + maxDepth + ", includeDevice = " + + includeDevice; + log.error(msg); + throw new DeviceOrganizationMgtPluginException(msg, e); + } catch (DeviceOrganizationMgtDAOException e) { + String msg = "Error occurred in the database level while retrieving child devices : " + + "deviceID = " + deviceId + ", maxDepth = " + maxDepth + ", includeDevice = " + + includeDevice; + log.error(msg); + throw new DeviceOrganizationMgtPluginException(msg, e); + } finally { + // Close the database connection + ConnectionManagerUtil.closeDBConnection(); + } + } + + /** + * {@inheritDoc} + */ + @Override + public DeviceNodeResult getParentsOfDeviceNode(int deviceId, int maxDepth, boolean includeDevice) + throws DeviceOrganizationMgtPluginException { + if (deviceId <= 0 || maxDepth <= 0) { + String msg = "Invalid input parameters for retrieving parent devices. Params : " + + "deviceID = " + deviceId + ", maxDepth = " + maxDepth + + ", includeDevice = " + includeDevice; + throw new BadRequestException(msg); + } + try { + // Open a database connection + ConnectionManagerUtil.openDBConnection(); + int tenantID = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(); + return deviceOrganizationDao.getParentsOfDeviceNode(deviceId, maxDepth, includeDevice, tenantID); + } catch (DBConnectionException e) { + String msg = "Error occurred while obtaining the database connection to retrieve parent devices for : " + + "device ID = " + deviceId + ", maxDepth = " + maxDepth + ", includeDevice = " + + includeDevice; + log.error(msg); + throw new DeviceOrganizationMgtPluginException(msg, e); + } catch (DeviceOrganizationMgtDAOException e) { + String msg = "Error occurred in the database level while retrieving parent devices for : " + + "device ID = " + deviceId + ", maxDepth = " + maxDepth + ", includeDevice = " + + includeDevice; + log.error(msg); + throw new DeviceOrganizationMgtPluginException(msg, e); + } finally { + // Close the database connection + ConnectionManagerUtil.closeDBConnection(); + } + } + + /** + * {@inheritDoc} + */ + @Override + public List getAllDeviceOrganizations() throws DeviceOrganizationMgtPluginException { + try { + // Open a database connection + ConnectionManagerUtil.openDBConnection(); + return deviceOrganizationDao.getAllDeviceOrganizations(); + } catch (DBConnectionException e) { + String msg = "Error occurred while obtaining the database connection to retrieve all device organizations."; + log.error(msg); + throw new DeviceOrganizationMgtPluginException(msg, e); + } catch (DeviceOrganizationMgtDAOException e) { + String msg = "Error occurred in the database level while retrieving all device organizations."; + log.error(msg); + throw new DeviceOrganizationMgtPluginException(msg, e); + } finally { + // Close the database connection + ConnectionManagerUtil.closeDBConnection(); + } + } + + /** + * {@inheritDoc} + */ + @Override + public List getDeviceOrganizationRoots(PaginationRequest request) throws DeviceOrganizationMgtPluginException { + try { + // Open a database connection + ConnectionManagerUtil.openDBConnection(); + int tenantID = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(); + return deviceOrganizationDao.getDeviceOrganizationRoots(request, tenantID); + } catch (DBConnectionException e) { + String msg = "Error occurred while obtaining the database connection to retrieve all device organizations."; + log.error(msg); + throw new DeviceOrganizationMgtPluginException(msg, e); + } catch (DeviceOrganizationMgtDAOException e) { + String msg = "Error occurred in the database level while retrieving all device organizations."; + log.error(msg); + throw new DeviceOrganizationMgtPluginException(msg, e); + } finally { + // Close the database connection + ConnectionManagerUtil.closeDBConnection(); + } + } + + /** + * {@inheritDoc} + */ + @Override + public List getDeviceOrganizationLeafs(PaginationRequest request) + throws DeviceOrganizationMgtPluginException { + try { + // Open a database connection + ConnectionManagerUtil.openDBConnection(); + int tenantID = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(); + return deviceOrganizationDao.getDeviceOrganizationLeafs(request, tenantID); + } catch (DBConnectionException e) { + String msg = "Error occurred while obtaining the database connection to retrieve all device organizations."; + log.error(msg); + throw new DeviceOrganizationMgtPluginException(msg, e); + } catch (DeviceOrganizationMgtDAOException e) { + String msg = "Error occurred in the database level while retrieving all device organizations."; + log.error(msg); + throw new DeviceOrganizationMgtPluginException(msg, e); + } finally { + // Close the database connection + ConnectionManagerUtil.closeDBConnection(); + } + } + + @Override + public void addAllDevices() throws DeviceOrganizationMgtPluginException { + try { + // Open a database connection +// ConnectionManagerUtil.openDBConnection(); + int tenantID = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(); + deviceOrganizationDao.addAllDevices(tenantID); + } catch (DeviceOrganizationMgtDAOException e) { + String msg = "Error occurred in the database level while retrieving all device organizations."; + log.error(msg); + throw new DeviceOrganizationMgtPluginException(msg, e); + } finally { + // Close the database connection +// ConnectionManagerUtil.closeDBConnection(); + } + } + + @Override + public void addOrganizations(int start, int end) throws DeviceOrganizationMgtPluginException { + try { + // Open a database connection +// ConnectionManagerUtil.openDBConnection(); + int tenantID = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(); + deviceOrganizationDao.addOrganizations(tenantID, start, end); + } catch (DeviceOrganizationMgtDAOException e) { + String msg = "Error occurred in the database level while retrieving all device organizations."; + log.error(msg); + throw new DeviceOrganizationMgtPluginException(msg, e); + } finally { + // Close the database connection +// ConnectionManagerUtil.closeDBConnection(); + } + } + + @Override + public boolean addDeviceOrganization(DeviceOrganization deviceOrganization) + throws DeviceOrganizationMgtPluginException { + if (deviceOrganization == null || deviceOrganization.getDeviceId() <= 0 || + !(deviceOrganization.getParentDeviceId() == null || deviceOrganization.getParentDeviceId() > 0)) { + throw new BadRequestException("Invalid input parameters for adding deviceOrganizations : " + + "deviceOrganization = " + deviceOrganization + + ", deviceID = " + "deviceID should be a positive number" + + "parentDeviceID = " + "parentDeviceID should be a positive number or null"); + } + String msg; + int deviceID = deviceOrganization.getDeviceId(); + Integer parentDeviceID = deviceOrganization.getParentDeviceId(); + boolean exists = isDeviceOrganizationExist(deviceID, parentDeviceID); + if (exists) { + log.error("Device Organization already exists"); + return false; + } + + try { + ConnectionManagerUtil.beginDBTransaction(); + int tenantID = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(); + deviceOrganization.setTenantID(tenantID); + AdditionResult result = deviceOrganizationDao.addDeviceOrganization(deviceOrganization); + if (result.isInserted() && !result.isCyclic()) { + msg = "Device organization added successfully. Device Organization details : " + + "deviceID = " + deviceID + ", parentDeviceID = " + parentDeviceID; + if (log.isDebugEnabled()) { + log.debug(msg); + } + } else { + ConnectionManagerUtil.rollbackDBTransaction(); + msg = "Device organization failed to add. Device Organization details : " + + "deviceID = " + deviceID + ", parentDeviceID = " + parentDeviceID; + return false; + } + ConnectionManagerUtil.commitDBTransaction(); + return true; + } catch (DBConnectionException e) { + msg = "Error occurred while obtaining the database connection to add device organization. " + + "Device Organization details : deviceID = " + deviceID + ", parentDeviceID = " + parentDeviceID; + log.error(msg); + throw new DeviceOrganizationMgtPluginException(msg, e); + } catch (DeviceOrganizationMgtDAOException e) { + ConnectionManagerUtil.rollbackDBTransaction(); + msg = "Error occurred in the database level while adding device organization. " + + "Device Organization details : device ID = " + deviceID + ", parent device ID = " + parentDeviceID; + log.error(msg); + throw new DeviceOrganizationMgtPluginException(msg, e); + } finally { + ConnectionManagerUtil.closeDBConnection(); + } + } + + public boolean deleteDeviceOrganizationByUniqueKey(int deviceID, Integer parentDeviceID) + throws DeviceOrganizationMgtPluginException { + if (deviceID <= 0 || !(parentDeviceID == null || parentDeviceID > 0)) { + throw new BadRequestException("Invalid input parameters for deviceOrganization update. : " + + ", deviceID = " + deviceID + + ", parentDeviceID = " + parentDeviceID); + } + try { + ConnectionManagerUtil.openDBConnection(); + int tenantID = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(); + return deviceOrganizationDao.deleteDeviceOrganizationByUniqueKey(deviceID, parentDeviceID, tenantID); + } catch (DBConnectionException e) { + String msg = "Error occurred while obtaining the database connection to retrieve organization. " + + "Params : deviceID = " + deviceID + ", parentDeviceID = " + parentDeviceID; + log.error(msg); + throw new DeviceOrganizationMgtPluginException(msg, e); + } catch (DeviceOrganizationMgtDAOException e) { + String msg = "Error occurred while retrieving device organization for deviceID " + + deviceID + " and parentDeviceID " + parentDeviceID; + log.error(msg); + throw new DeviceOrganizationMgtPluginException(msg, e); + } finally { + ConnectionManagerUtil.closeDBConnection(); + } + } + + +// private boolean isCyclicRelationshipExist(int deviceID, Integer parentDeviceID) throws DeviceOrganizationMgtPluginException { +// try { +//// ConnectionManagerUtil.openDBConnection(); +// int tenantID = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(); +// return deviceOrganizationDao.isCyclicRelationshipExist(deviceID, parentDeviceID, tenantID); +// } +//// catch (DBConnectionException e) { +//// String msg = "Error occurred while obtaining the database connection to check cyclic relationship. " + +//// "Params : deviceID = " + deviceID + ", parentDeviceID = " + parentDeviceID; +//// log.error(msg); +//// throw new DeviceOrganizationMgtPluginException(msg, e); +//// } +// catch (DeviceOrganizationMgtDAOException e) { +// String msg = "Error occurred in the database level while checking for cyclic relationship. " + +// "Params : deviceID = " + deviceID + ", parentDeviceID = " + parentDeviceID; +// log.error(msg); +// throw new DeviceOrganizationMgtPluginException(msg, e); +// } finally { +//// ConnectionManagerUtil.closeDBConnection(); +// } +// } + + + /** + * {@inheritDoc} + */ + @Override + public boolean isDeviceOrganizationExist(int deviceID, Integer parentDeviceID) throws DeviceOrganizationMgtPluginException { + if (deviceID <= 0 || !(parentDeviceID == null || parentDeviceID > 0)) { + throw new BadRequestException("Invalid input parameters for deviceOrganization update. : " + + ", deviceID = " + deviceID + + ", parentDeviceID = " + parentDeviceID); + } + try { + ConnectionManagerUtil.openDBConnection(); + int tenantID = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(); + return deviceOrganizationDao.isDeviceOrganizationExist(deviceID, parentDeviceID, tenantID); + } catch (DBConnectionException e) { + String msg = "Error occurred while obtaining the database connection to check organization existence. " + + "Params : deviceID = " + deviceID + ", parentDeviceID = " + parentDeviceID; + log.error(msg); + throw new DeviceOrganizationMgtPluginException(msg, e); + } catch (DeviceOrganizationMgtDAOException e) { + String msg = "Error occurred in the database level while checking organization existence. " + + "Params : deviceID = " + deviceID + ", parentDeviceID = " + parentDeviceID; + log.error(msg); + throw new DeviceOrganizationMgtPluginException(msg, e); + } finally { + ConnectionManagerUtil.closeDBConnection(); + } + } + + /** + * {@inheritDoc} + */ + @Override + public DeviceOrganization getDeviceOrganizationByUniqueKey(int deviceID, Integer parentDeviceID) + throws DeviceOrganizationMgtPluginException { + if (deviceID <= 0 || !(parentDeviceID == null || parentDeviceID > 0)) { + throw new BadRequestException("Invalid input parameters for deviceOrganization update. : " + + ", deviceID = " + deviceID + + ", parentDeviceID = " + parentDeviceID); + } + try { + ConnectionManagerUtil.openDBConnection(); + int tenantID = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(); + return deviceOrganizationDao.getDeviceOrganizationByUniqueKey(deviceID, parentDeviceID, tenantID); + } catch (DBConnectionException e) { + String msg = "Error occurred while obtaining the database connection to retrieve organization. " + + "Params : deviceID = " + deviceID + ", parentDeviceID = " + parentDeviceID; + log.error(msg); + throw new DeviceOrganizationMgtPluginException(msg, e); + } catch (DeviceOrganizationMgtDAOException e) { + String msg = "Error occurred while retrieving device organization for deviceID " + + deviceID + " and parentDeviceID " + parentDeviceID; + log.error(msg); + throw new DeviceOrganizationMgtPluginException(msg, e); + } finally { + ConnectionManagerUtil.closeDBConnection(); + } + } + + /** + * {@inheritDoc} + */ + @Override + public boolean updateDeviceOrganization(DeviceOrganization deviceOrganization) + throws DeviceOrganizationMgtPluginException { + + String msg; + DeviceOrganization organization = getDeviceOrganizationByID(deviceOrganization.getOrganizationId()); + if (organization == null) { + msg = "Cannot find device organization for organizationID = " + deviceOrganization.getOrganizationId(); + log.error(msg); + throw new DeviceOrganizationMgtPluginException(msg); + } + + try { + ConnectionManagerUtil.beginDBTransaction(); + int tenantID = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(); + deviceOrganization.setTenantID(tenantID); + boolean result = deviceOrganizationDao.updateDeviceOrganization(deviceOrganization); + if (result) { + msg = "Device organization updated successfully for organizationID = " + deviceOrganization.getOrganizationId(); + if (log.isDebugEnabled()) { + log.debug(msg); + } + } else { + ConnectionManagerUtil.rollbackDBTransaction(); + msg = "Device organization failed to update for organizationID = " + deviceOrganization.getOrganizationId(); + throw new DeviceOrganizationMgtPluginException(msg); + } + ConnectionManagerUtil.commitDBTransaction(); + return true; + } catch (DBConnectionException e) { + msg = "Error occurred while obtaining the database connection to update device organization for " + + "organizationID = " + organization.getOrganizationId(); + log.error(msg); + throw new DeviceOrganizationMgtPluginException(msg, e); + } catch (DeviceOrganizationMgtDAOException e) { + ConnectionManagerUtil.rollbackDBTransaction(); + msg = "Error occurred in the database level while updating device organization for " + + "organizationID = " + organization.getOrganizationId(); + log.error(msg); + throw new DeviceOrganizationMgtPluginException(msg, e); + } finally { + ConnectionManagerUtil.closeDBConnection(); + } + } + + /** + * {@inheritDoc} + */ + @Override + public DeviceOrganization getDeviceOrganizationByID(int organizationID) + throws DeviceOrganizationMgtPluginException { + if (organizationID <= 0) { + throw new BadRequestException("organizationID must be a positive number. " + + "Invalid input parameters for getting deviceOrganization for : " + + "organizationID = " + organizationID); + } + try { + // Open a database connection + ConnectionManagerUtil.openDBConnection(); + int tenantID = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(); + return deviceOrganizationDao.getDeviceOrganizationByID(organizationID, tenantID); + } catch (DBConnectionException e) { + String msg = "Error occurred while obtaining the database connection to retrieve deviceOrganization for : " + + "organizationID = " + organizationID; + log.error(msg); + throw new DeviceOrganizationMgtPluginException(msg, e); + } catch (DeviceOrganizationMgtDAOException e) { + String msg = "Error occurred in the database level while retrieving deviceOrganization for : " + + "organizationID = " + organizationID; + log.error(msg); + throw new DeviceOrganizationMgtPluginException(msg, e); + } finally { + // Close the database connection + ConnectionManagerUtil.closeDBConnection(); + } + } + + /** + * {@inheritDoc} + */ + @Override + public boolean deleteDeviceOrganizationByID(int organizationID) + throws DeviceOrganizationMgtPluginException { + if (organizationID <= 0) { + throw new BadRequestException("organizationID must be a positive number." + + "Invalid input parameters for deviceOrganization Deletion : " + + "organizationID = " + organizationID); + } + String msg; + + DeviceOrganization deviceOrganization = getDeviceOrganizationByID(organizationID); + if (deviceOrganization == null) { + msg = "Cannot find device organization for Deletion : organizationID = " + organizationID; + log.error(msg); + return false; + } + + try { + ConnectionManagerUtil.beginDBTransaction(); + int tenantID = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(); + boolean result = deviceOrganizationDao.deleteDeviceOrganizationByID(organizationID, tenantID); + if (result) { + msg = "Device organization record deleted successfully for organizationID = " + organizationID; + if (log.isDebugEnabled()) { + log.debug(msg); + } + } else { + ConnectionManagerUtil.rollbackDBTransaction(); + msg = "Device organization failed to delete for organizationID = " + organizationID; + throw new DeviceOrganizationMgtPluginException(msg); + } + ConnectionManagerUtil.commitDBTransaction(); + return true; + } catch (DBConnectionException e) { + msg = "Error occurred while obtaining the database connection to delete device organization for " + + "organizationID = " + organizationID; + log.error(msg); + throw new DeviceOrganizationMgtPluginException(msg, e); + } catch (DeviceOrganizationMgtDAOException e) { + ConnectionManagerUtil.rollbackDBTransaction(); + msg = "Error occurred in the database level while deleting device organization for " + + "organizationID = " + organizationID; + log.error(msg); + throw new DeviceOrganizationMgtPluginException(msg, e); + } finally { + ConnectionManagerUtil.closeDBConnection(); + + } + } + + /** + * {@inheritDoc} + */ + @Override + public boolean deleteDeviceAssociations(int deviceID) + throws DeviceOrganizationMgtPluginException { + if (deviceID <= 0) { + throw new BadRequestException("deviceID must be a positive number." + + "Invalid input parameters for deviceID = " + deviceID); + } + String msg; + + boolean deviceIdExist = isDeviceIdExist(deviceID); + if (!deviceIdExist) { + msg = "Cannot find device organizations associated with deviceID = " + deviceID; + log.error(msg); + return false; + } + + try { + ConnectionManagerUtil.beginDBTransaction(); + int tenantID = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(); + boolean result = deviceOrganizationDao.deleteDeviceAssociations(deviceID, tenantID); + if (result) { + msg = "Device organization records associated with deviceID = " + deviceID + " are deleted successfully."; + if (log.isDebugEnabled()) { + log.debug(msg); + } + } else { + ConnectionManagerUtil.rollbackDBTransaction(); + msg = "Device organization records associated with deviceID = " + deviceID + " have failed to delete."; + throw new DeviceOrganizationMgtPluginException(msg); + } + ConnectionManagerUtil.commitDBTransaction(); + return true; + } catch (DBConnectionException e) { + msg = "Error occurred while obtaining the database connection to delete device organizations associated with " + + "deviceID = " + deviceID; + log.error(msg); + throw new DeviceOrganizationMgtPluginException(msg, e); + } catch (DeviceOrganizationMgtDAOException e) { + ConnectionManagerUtil.rollbackDBTransaction(); + msg = "Error occurred in the database level while deleting device organizations associated with " + + "deviceID = " + deviceID; + log.error(msg); + throw new DeviceOrganizationMgtPluginException(msg, e); + } finally { + ConnectionManagerUtil.closeDBConnection(); + + } + } + + /** + * {@inheritDoc} + */ + @Override + public boolean isDeviceIdExist(int deviceID) + throws DeviceOrganizationMgtPluginException { + if (deviceID <= 0) { + throw new BadRequestException("deviceID must be a positive number." + + "Invalid input parameters for checking deviceID existence " + + "in deviceOrganization : deviceID = " + deviceID); + } + try { + // Open a database connection + ConnectionManagerUtil.openDBConnection(); + int tenantID = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(); + return deviceOrganizationDao.isDeviceIdExist(deviceID, tenantID); + } catch (DBConnectionException e) { + String msg = "Error occurred while obtaining the database connection to check deviceID existence " + + "in deviceOrganization : deviceID = " + deviceID; + log.error(msg); + throw new DeviceOrganizationMgtPluginException(msg, e); + } catch (DeviceOrganizationMgtDAOException e) { + String msg = "Error occurred in the database level while checking the existence " + + "in deviceOrganization : deviceID = " + deviceID; + log.error(msg); + throw new DeviceOrganizationMgtPluginException(msg, e); + } finally { + // Close the database connection + ConnectionManagerUtil.closeDBConnection(); + } + } + + /** + * {@inheritDoc} + */ + @Override + public boolean isChildDeviceIdExist(int deviceID) + throws DeviceOrganizationMgtPluginException { + if (deviceID <= 0) { + throw new BadRequestException("deviceID must be a positive number." + + "Invalid input parameters for checking deviceID existence " + + "in deviceOrganization : deviceID = " + deviceID); + } + try { + // Open a database connection + ConnectionManagerUtil.openDBConnection(); + int tenantID = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(); + return deviceOrganizationDao.isChildDeviceIdExist(deviceID, tenantID); + } catch (DBConnectionException e) { + String msg = "Error occurred while obtaining the database connection to check child deviceID existence " + + "in deviceOrganization : deviceID = " + deviceID; + log.error(msg); + throw new DeviceOrganizationMgtPluginException(msg, e); + } catch (DeviceOrganizationMgtDAOException e) { + String msg = "Error occurred in the database level while checking the child deviceID existence " + + "in deviceOrganization : deviceID = " + deviceID; + log.error(msg); + throw new DeviceOrganizationMgtPluginException(msg, e); + } finally { + // Close the database connection + ConnectionManagerUtil.closeDBConnection(); + } + } +} diff --git a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/main/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/internal/DeviceOrganizationMgtDataHolder.java b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/main/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/internal/DeviceOrganizationMgtDataHolder.java new file mode 100644 index 0000000000..d6a5bb2545 --- /dev/null +++ b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/main/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/internal/DeviceOrganizationMgtDataHolder.java @@ -0,0 +1,66 @@ +/* + * Copyright (c) 2018 - 2023, 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.device.mgt.extensions.device.organization.internal; + +import io.entgra.device.mgt.core.device.mgt.core.service.DeviceManagementProviderService; +import io.entgra.device.mgt.core.device.mgt.extensions.device.organization.spi.DeviceOrganizationService; +import org.wso2.carbon.registry.core.service.RegistryService; + +/** + * Device Organization data holder class + */ +public class DeviceOrganizationMgtDataHolder { + + public static final DeviceOrganizationMgtDataHolder thisInstance = new DeviceOrganizationMgtDataHolder(); + + private RegistryService registryService; + private DeviceOrganizationService deviceOrganizationService; + private DeviceManagementProviderService deviceManagementProviderService; + + private DeviceOrganizationMgtDataHolder() { + } + + public static DeviceOrganizationMgtDataHolder getInstance() { + return thisInstance; + } + + public RegistryService getRegistryService() { + return registryService; + } + + public void setRegistryService(RegistryService registryService) { + this.registryService = registryService; + } + + + public DeviceOrganizationService getDeviceOrganizationService() { + return deviceOrganizationService; + } + + public void setDeviceOrganizationService(DeviceOrganizationService deviceOrganizationService) { + this.deviceOrganizationService = deviceOrganizationService; + } + + public DeviceManagementProviderService getDeviceManagementProviderService() { + return deviceManagementProviderService; + } + + public void setDeviceManagementProviderService(DeviceManagementProviderService deviceManagementProviderService) { + this.deviceManagementProviderService = deviceManagementProviderService; + } +} diff --git a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/main/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/internal/DeviceOrganizationMgtServiceComponent.java b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/main/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/internal/DeviceOrganizationMgtServiceComponent.java new file mode 100644 index 0000000000..b7a84ca31a --- /dev/null +++ b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/main/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/internal/DeviceOrganizationMgtServiceComponent.java @@ -0,0 +1,147 @@ +/* + * Copyright (c) 2018 - 2023, 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.device.mgt.extensions.device.organization.internal; + +import io.entgra.device.mgt.core.device.mgt.core.config.DeviceConfigurationManager; +import io.entgra.device.mgt.core.device.mgt.core.config.DeviceManagementConfig; +import io.entgra.device.mgt.core.device.mgt.core.config.datasource.DataSourceConfig; +import io.entgra.device.mgt.core.device.mgt.core.service.DeviceManagementProviderService; +import io.entgra.device.mgt.core.device.mgt.extensions.device.organization.dao.DeviceOrganizationDAOFactory; +import io.entgra.device.mgt.core.device.mgt.extensions.device.organization.impl.DeviceOrganizationServiceImpl; +import io.entgra.device.mgt.core.device.mgt.extensions.device.organization.spi.DeviceOrganizationService; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.osgi.framework.BundleContext; +import org.osgi.service.component.ComponentContext; +import org.wso2.carbon.ndatasource.core.DataSourceService; +import org.wso2.carbon.registry.core.service.RegistryService; + +/** + * @scr.component name="io.entgra.device.mgt.core.device.mgt.extensions.device.organization.internal.DeviceOrganizationMgtServiceComponent" immediate="true" + * @scr.reference name="org.wso2.carbon.device.manager" + * interface="io.entgra.device.mgt.core.device.mgt.core.service.DeviceManagementProviderService" + * cardinality="1..1" + * policy="dynamic" + * bind="setDeviceManagementService" + * unbind="unsetDeviceManagementService" + * @scr.reference name="org.wso2.carbon.ndatasource" + * interface="org.wso2.carbon.ndatasource.core.DataSourceService" + * cardinality="1..1" + * policy="dynamic" + * bind="setDataSourceService" + * unbind="unsetDataSourceService" + * @scr.reference name="registry.service" + * interface="org.wso2.carbon.registry.core.service.RegistryService" + * cardinality="0..1" + * policy="dynamic" + * bind="setRegistryService" + * unbind="unsetRegistryService" + */ +public class DeviceOrganizationMgtServiceComponent { + + private static final Log log = LogFactory.getLog(DeviceOrganizationMgtServiceComponent.class); + + /** + * @param componentContext + */ + protected void activate(ComponentContext componentContext) { + + if (log.isDebugEnabled()) { + log.debug("Activating Device Organization Management Service Component"); + } + try { + BundleContext bundleContext = componentContext.getBundleContext(); + + DeviceManagementConfig config = DeviceConfigurationManager.getInstance().getDeviceManagementConfig(); + DataSourceConfig dsConfig = config.getDeviceManagementConfigRepository().getDataSourceConfig(); + DeviceOrganizationDAOFactory.init(dsConfig); + + DeviceOrganizationService deviceOrganizationService = new DeviceOrganizationServiceImpl(); + DeviceOrganizationMgtDataHolder.getInstance().setDeviceOrganizationService(deviceOrganizationService); + bundleContext.registerService(DeviceOrganizationService.class, deviceOrganizationService, null); + + if (log.isDebugEnabled()) { + log.debug("Device Organization Management Service Component has been successfully activated"); + } + } catch (Throwable e) { + log.error("Error occurred while activating Device Organization Management Service Component", e); + } + } + + /** + * @param componentContext + */ + protected void deactivate(ComponentContext componentContext) { + if (log.isDebugEnabled()) { + log.debug("De-activating Device Organization Management Service Component"); + } + } + + @SuppressWarnings("unused") + protected void setDeviceManagementService(DeviceManagementProviderService deviceManagementProviderService) { + if (log.isDebugEnabled()) { + log.debug("Setting Device Management Service to Device Organization Mgt SC"); + } + DeviceOrganizationMgtDataHolder.getInstance().setDeviceManagementProviderService(deviceManagementProviderService); + } + + @SuppressWarnings("unused") + protected void unsetDeviceManagementService(DeviceManagementProviderService deviceManagementService) { + if (log.isDebugEnabled()) { + log.debug("Removing Device Management Service from Device Organization Mgt SC"); + } + DeviceOrganizationMgtDataHolder.getInstance().setDeviceManagementProviderService(null); + } + + /** + * @param dataSourceService + */ + protected void setDataSourceService(DataSourceService dataSourceService) { + if (log.isDebugEnabled()) { + log.debug("Data source service set to Device Organization Mgt component"); + } + } + + /** + * @param dataSourceService + */ + protected void unsetDataSourceService(DataSourceService dataSourceService) { + //do nothing + if (log.isDebugEnabled()) { + log.debug("Removing Data Source service from Device Organization Mgt component"); + } + } + + + protected void setRegistryService(RegistryService registryService) { + if (log.isDebugEnabled()) { + log.debug("RegistryService set to Device Organization Mgt component"); + } + DeviceOrganizationMgtDataHolder.getInstance().setRegistryService(registryService); + } + + protected void unsetRegistryService(RegistryService registryService) { + if (log.isDebugEnabled()) { + log.debug("Removing RegistryService from Device Organization Mgt component"); + } + DeviceOrganizationMgtDataHolder.getInstance().setRegistryService(null); + } + + +} diff --git a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/main/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/spi/DeviceOrganizationService.java b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/main/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/spi/DeviceOrganizationService.java new file mode 100644 index 0000000000..b69e386773 --- /dev/null +++ b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/main/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/spi/DeviceOrganizationService.java @@ -0,0 +1,190 @@ +/* + * Copyright (c) 2018 - 2023, 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.device.mgt.extensions.device.organization.spi; + +import io.entgra.device.mgt.core.device.mgt.extensions.device.organization.dto.DeviceNodeResult; +import io.entgra.device.mgt.core.device.mgt.extensions.device.organization.dto.DeviceOrganization; +import io.entgra.device.mgt.core.device.mgt.extensions.device.organization.dto.PaginationRequest; +import io.entgra.device.mgt.core.device.mgt.extensions.device.organization.exception.DeviceOrganizationMgtPluginException; + +import java.util.List; + +/** + * This interface defines operations for managing device organizations. + */ +public interface DeviceOrganizationService { + + /** + * Adds a new device organization. + * + * @param deviceOrganization The device organization to add. + * @return True if the operation was successful, false otherwise. + * @throws DeviceOrganizationMgtPluginException If an error occurs during the operation. + */ + boolean addDeviceOrganization(DeviceOrganization deviceOrganization) + throws DeviceOrganizationMgtPluginException; + + /** + * Retrieves a list of child nodes of a given device node, up to a specified depth. + * + * @param deviceID The parent device ID. + * @param maxDepth The maximum depth of child nodes to retrieve. + * @param includeDevice Indicates whether to include device information in the retrieved nodes. + * @return A list of child device nodes. + * @throws DeviceOrganizationMgtPluginException If an error occurs during the operation. + */ + DeviceNodeResult getChildrenOfDeviceNode(int deviceID, int maxDepth, boolean includeDevice) + throws DeviceOrganizationMgtPluginException; + + /** + * Retrieves a list of parent nodes of a given device node, up to a specified depth. + * + * @param deviceID The child device ID. + * @param maxDepth The maximum depth of parent nodes to retrieve. + * @param includeDevice Indicates whether to include device information in the retrieved nodes. + * @return A list of parent device nodes. + * @throws DeviceOrganizationMgtPluginException If an error occurs during the operation. + */ + DeviceNodeResult getParentsOfDeviceNode(int deviceID, int maxDepth, boolean includeDevice) + throws DeviceOrganizationMgtPluginException; + + /** + * Retrieves a list of all device organizations. + * + * @return A list of all device organizations. + * @throws DeviceOrganizationMgtPluginException If an error occurs during the operation. + */ + List getAllDeviceOrganizations() throws DeviceOrganizationMgtPluginException; + + /** + * Retrieves device Organization Leafs + * + * @return A list of leaf device organizations. + * @throws DeviceOrganizationMgtPluginException + */ + List getDeviceOrganizationLeafs(PaginationRequest request) throws DeviceOrganizationMgtPluginException; + + /** + * Retrieves device Organization Roots + * + * @return A list of root device organizations. + * @throws DeviceOrganizationMgtPluginException + */ + List getDeviceOrganizationRoots(PaginationRequest request) throws DeviceOrganizationMgtPluginException; + + /** + * Retrieves a specific device organization by its organization ID. + * + * @param organizationId The organization ID of the device organization to retrieve. + * @return The device organization with the specified ID. + * @throws DeviceOrganizationMgtPluginException If an error occurs during the operation. + */ + DeviceOrganization getDeviceOrganizationByID(int organizationId) + throws DeviceOrganizationMgtPluginException; + + /** + * Checks if a device organization with the specified device and parent device IDs already exists. + * + * @param deviceId The ID of the device. + * @param parentDeviceId The ID of the parent device. + * @return True if the organization exists, false otherwise. + * @throws DeviceOrganizationMgtPluginException If an error occurs during the operation. + */ + boolean isDeviceOrganizationExist(int deviceId, Integer parentDeviceId) + throws DeviceOrganizationMgtPluginException; + + /** + * Retrieve a device organization by its unique key (deviceId and parentDeviceId). + * + * @param deviceId The ID of the device. + * @param parentDeviceId The ID of the parent device. + * @return The retrieved DeviceOrganization object, or null if not found. + * @throws DeviceOrganizationMgtPluginException If an error occurs. + */ + DeviceOrganization getDeviceOrganizationByUniqueKey(int deviceId, Integer parentDeviceId) + throws DeviceOrganizationMgtPluginException; + + /** + * Checks whether a record with the specified device ID exists either in the deviceID column or + * parentDeviceID column in the device organization table. + * + * @param deviceId The ID of the device to check. + * @return True if the device exists, false otherwise. + * @throws DeviceOrganizationMgtPluginException If an error occurs during the operation. + */ + boolean isDeviceIdExist(int deviceId) + throws DeviceOrganizationMgtPluginException; + + /** + * Checks if a child device with the given `deviceID` exists. + * + * @param deviceID The ID of the child device to check. + * @return `true` if the child device exists, `false` otherwise. + * @throws DeviceOrganizationMgtPluginException If an error occurs while checking the existence. + */ + boolean isChildDeviceIdExist(int deviceID) + throws DeviceOrganizationMgtPluginException; + + /** + * Updates a device organization. + * + * @param organization The device organization to update. + * @return True if the operation was successful, false otherwise. + * @throws DeviceOrganizationMgtPluginException If an error occurs during the operation. + */ + boolean updateDeviceOrganization(DeviceOrganization organization) + throws DeviceOrganizationMgtPluginException; + + /** + * Deletes a device organization by its organizationID. + * + * @param organizationId The organization ID of the device organization to delete. + * @return True if the operation was successful, false otherwise. + * @throws DeviceOrganizationMgtPluginException If an error occurs during the operation. + */ + boolean deleteDeviceOrganizationByID(int organizationId) + throws DeviceOrganizationMgtPluginException; + + /** + * Deletes records associated with a particular device ID from the device organization table. + * This method deletes records where the provided device ID matches either the deviceID column or + * parentDeviceID column in the device organization table. + * + * @param deviceId The ID of the device for which associations should be deleted. + * @return True if the operation was successful, false otherwise. + * @throws DeviceOrganizationMgtPluginException If an error occurs during the operation. + */ + boolean deleteDeviceAssociations(int deviceId) + throws DeviceOrganizationMgtPluginException; + + /** + * This method used only for testing + * @throws DeviceOrganizationMgtPluginException + */ + void addAllDevices() throws DeviceOrganizationMgtPluginException; + + /** + * This method used only for testing + * @throws DeviceOrganizationMgtPluginException + */ + void addOrganizations(int start, int end) throws DeviceOrganizationMgtPluginException; + + + //In case we need to remove the device organization with enrollment removal,we need to implement a callback to + //remove the device organization mapping whenever the device removal happening in enrollment level. +} diff --git a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/DAONegativeTest.java b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/DAONegativeTest.java new file mode 100644 index 0000000000..1df01c4983 --- /dev/null +++ b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/DAONegativeTest.java @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2018 - 2023, 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.device.mgt.extensions.device.organization; + +import io.entgra.device.mgt.core.device.mgt.extensions.device.organization.dao.DeviceOrganizationDAO; +import io.entgra.device.mgt.core.device.mgt.extensions.device.organization.dao.DeviceOrganizationDAOFactory; +import io.entgra.device.mgt.core.device.mgt.extensions.device.organization.mock.BaseDeviceOrganizationTest; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.testng.annotations.BeforeClass; + +public class DAONegativeTest extends BaseDeviceOrganizationTest { + + private static final Log log = LogFactory.getLog(DAONegativeTest.class); + + private DeviceOrganizationDAO deviceOrganizationDAO; + + @BeforeClass + public void init() { + deviceOrganizationDAO = DeviceOrganizationDAOFactory.getDeviceOrganizationDAO(); + log.info("DAO test initialized"); + } + +} diff --git a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/DAOTest.java b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/DAOTest.java new file mode 100644 index 0000000000..57154985f5 --- /dev/null +++ b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/DAOTest.java @@ -0,0 +1,169 @@ +/* + * Copyright (c) 2018 - 2023, 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.device.mgt.extensions.device.organization; + +import io.entgra.device.mgt.core.device.mgt.extensions.device.organization.dao.DeviceOrganizationDAO; +import io.entgra.device.mgt.core.device.mgt.extensions.device.organization.dao.DeviceOrganizationDAOFactory; +import io.entgra.device.mgt.core.device.mgt.extensions.device.organization.dao.util.ConnectionManagerUtil; +import io.entgra.device.mgt.core.device.mgt.extensions.device.organization.dto.AdditionResult; +import io.entgra.device.mgt.core.device.mgt.extensions.device.organization.dto.DeviceNodeResult; +import io.entgra.device.mgt.core.device.mgt.extensions.device.organization.dto.DeviceOrganization; +import io.entgra.device.mgt.core.device.mgt.extensions.device.organization.exception.DBConnectionException; +import io.entgra.device.mgt.core.device.mgt.extensions.device.organization.exception.DeviceOrganizationMgtDAOException; +import io.entgra.device.mgt.core.device.mgt.extensions.device.organization.mock.BaseDeviceOrganizationTest; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.wso2.carbon.context.PrivilegedCarbonContext; +import org.testng.Assert; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.Test; + +import java.util.Date; +import java.util.List; + +public class DAOTest extends BaseDeviceOrganizationTest { + + private static final Log log = LogFactory.getLog(DAOTest.class); + + private DeviceOrganizationDAO deviceOrganizationDAO; + + @BeforeClass + public void init() { + deviceOrganizationDAO = DeviceOrganizationDAOFactory.getDeviceOrganizationDAO(); + log.info("DAO test initialized"); + } + + @Test(dependsOnMethods = "testAddDeviceOrganizationDAO") + public void testGetChildrenOfDAO() throws DBConnectionException, DeviceOrganizationMgtDAOException { + ConnectionManagerUtil.openDBConnection(); + int deviceId = 2; + int maxDepth = 4; + boolean includeDevice = true; + int tenantID = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(); + DeviceNodeResult childrenList = deviceOrganizationDAO.getChildrenOfDeviceNode(deviceId, maxDepth, includeDevice, tenantID); + ConnectionManagerUtil.closeDBConnection(); + Assert.assertNotNull(childrenList, "Cannot be null"); + } + + @Test(dependsOnMethods = "testAddDeviceOrganizationDAO") + public void testGetParentsOfDAO() throws DBConnectionException, DeviceOrganizationMgtDAOException { + ConnectionManagerUtil.openDBConnection(); + int deviceID = 4; + int maxDepth = 4; + boolean includeDevice = false; + int tenantID = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(); + DeviceNodeResult parentList = deviceOrganizationDAO.getParentsOfDeviceNode(deviceID, maxDepth, includeDevice, tenantID); + ConnectionManagerUtil.closeDBConnection(); + Assert.assertNotNull(parentList, "Cannot be null"); + } + + @Test + public void testAddDeviceOrganizationDAO() throws DBConnectionException, DeviceOrganizationMgtDAOException { + + int tenantID = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(); + ConnectionManagerUtil.beginDBTransaction(); + deviceOrganizationDAO.deleteDeviceAssociations(1, tenantID); + ConnectionManagerUtil.commitDBTransaction(); + ConnectionManagerUtil.closeDBConnection(); + ConnectionManagerUtil.beginDBTransaction(); + deviceOrganizationDAO.deleteDeviceAssociations(2, tenantID); + ConnectionManagerUtil.commitDBTransaction(); + ConnectionManagerUtil.closeDBConnection(); + DeviceOrganization deviceOrganization = new DeviceOrganization(); + deviceOrganization.setDeviceId(2); + deviceOrganization.setParentDeviceId(null); + deviceOrganization.setUpdateTime(new Date(System.currentTimeMillis())); + ConnectionManagerUtil.beginDBTransaction(); + AdditionResult result = deviceOrganizationDAO.addDeviceOrganization(deviceOrganization); + ConnectionManagerUtil.commitDBTransaction(); + ConnectionManagerUtil.closeDBConnection(); + DeviceOrganization deviceOrganization1 = new DeviceOrganization(); + deviceOrganization1.setDeviceId(4); + deviceOrganization1.setParentDeviceId(1); + deviceOrganization1.setUpdateTime(new Date(System.currentTimeMillis())); + ConnectionManagerUtil.beginDBTransaction(); + AdditionResult result1 = deviceOrganizationDAO.addDeviceOrganization(deviceOrganization1); + ConnectionManagerUtil.commitDBTransaction(); + ConnectionManagerUtil.closeDBConnection(); + + DeviceOrganization deviceOrganization2 = new DeviceOrganization(); + deviceOrganization1.setDeviceId(3); + deviceOrganization1.setParentDeviceId(1); + deviceOrganization1.setUpdateTime(new Date(System.currentTimeMillis())); + ConnectionManagerUtil.beginDBTransaction(); + AdditionResult result2 = deviceOrganizationDAO.addDeviceOrganization(deviceOrganization1); + ConnectionManagerUtil.commitDBTransaction(); + ConnectionManagerUtil.closeDBConnection(); + + } + + @Test(dependsOnMethods = "testAddDeviceOrganizationDAO") + public void testGetDeviceOrganizationByIDDAO() throws DBConnectionException, DeviceOrganizationMgtDAOException { + int tenantID = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(); + ConnectionManagerUtil.beginDBTransaction(); + DeviceOrganization deviceOrganization = deviceOrganizationDAO.getDeviceOrganizationByID(1, tenantID); + ConnectionManagerUtil.closeDBConnection(); + if (deviceOrganization != null) { + log.info("Device Organization device ID : " + deviceOrganization.getDeviceId() + + " ,Device Organization Parent Device ID : " + deviceOrganization.getParentDeviceId()); + } + } + + @Test(dependsOnMethods = "testAddDeviceOrganizationDAO") + public void testDoesDeviceIdExistDAO() throws DBConnectionException, DeviceOrganizationMgtDAOException { + int tenantID = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(); + ConnectionManagerUtil.beginDBTransaction(); + boolean isDeviceIdExist = deviceOrganizationDAO.isDeviceIdExist(1, tenantID); + ConnectionManagerUtil.closeDBConnection(); + + } + + @Test(dependsOnMethods = "testAddDeviceOrganizationDAO") + public void testDeleteDeviceOrganizationByIDDAO() throws DBConnectionException, DeviceOrganizationMgtDAOException { + int tenantID = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(); + ConnectionManagerUtil.beginDBTransaction(); + boolean result = deviceOrganizationDAO.deleteDeviceOrganizationByID(1, tenantID); + ConnectionManagerUtil.commitDBTransaction(); + ConnectionManagerUtil.closeDBConnection(); + } + + @Test(dependsOnMethods = "testAddDeviceOrganizationDAO") + public void deleteDeviceOrganizationsByDeviceIdDAO() throws DBConnectionException, DeviceOrganizationMgtDAOException { + int tenantID = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(); + ConnectionManagerUtil.beginDBTransaction(); + boolean result = deviceOrganizationDAO.deleteDeviceAssociations(1, tenantID); + ConnectionManagerUtil.commitDBTransaction(); + ConnectionManagerUtil.closeDBConnection(); + } + + @Test(dependsOnMethods = "testAddDeviceOrganizationDAO") + public void testGetAllOrganizations() throws DBConnectionException, DeviceOrganizationMgtDAOException { + ConnectionManagerUtil.beginDBTransaction(); + List organizations = deviceOrganizationDAO.getAllDeviceOrganizations(); + for (DeviceOrganization organization : organizations) { + log.info("organizationID = " + organization.getOrganizationId()); + log.info("deviceID = " + organization.getDeviceId()); + log.info("parentDeviceID = " + organization.getParentDeviceId()); + log.info("updateTime = " + organization.getUpdateTime()); + log.info("----------------------------------------------"); + } + ConnectionManagerUtil.closeDBConnection(); + } + +} diff --git a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/DataSourceConfig.java b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/DataSourceConfig.java new file mode 100644 index 0000000000..240633038a --- /dev/null +++ b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/DataSourceConfig.java @@ -0,0 +1,78 @@ +/* + * Copyright (c) 2018 - 2023, 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.device.mgt.extensions.device.organization; + +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; + +@XmlRootElement(name = "DataSourceConfig") +public class DataSourceConfig { + + private String url; + private String driverClassName; + private String user; + private String password; + + @Override + public String toString() { + return "DataSourceConfig[" + + " Url ='" + url + '\'' + + ", DriverClassName ='" + driverClassName + '\'' + + ", UserName ='" + user + '\'' + + ", Password ='" + password + '\'' + + "]"; + } + + @XmlElement(name = "Url", nillable = false) + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + @XmlElement(name = "DriverClassName", nillable = false) + public String getDriverClassName() { + return driverClassName; + } + + public void setDriverClassName(String driverClassName) { + this.driverClassName = driverClassName; + } + + @XmlElement(name = "User", nillable = false) + public String getUser() { + return user; + } + + public void setUser(String user) { + this.user = user; + } + + @XmlElement(name = "Password", nillable = false) + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + +} diff --git a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/ServiceNegativeTest.java b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/ServiceNegativeTest.java new file mode 100644 index 0000000000..761c0aab74 --- /dev/null +++ b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/ServiceNegativeTest.java @@ -0,0 +1,198 @@ +/* + * Copyright (c) 2018 - 2023, 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.device.mgt.extensions.device.organization; + +import io.entgra.device.mgt.core.device.mgt.extensions.device.organization.dto.DeviceOrganization; +import io.entgra.device.mgt.core.device.mgt.extensions.device.organization.exception.BadRequestException; +import io.entgra.device.mgt.core.device.mgt.extensions.device.organization.exception.DeviceOrganizationMgtPluginException; +import io.entgra.device.mgt.core.device.mgt.extensions.device.organization.impl.DeviceOrganizationServiceImpl; +import io.entgra.device.mgt.core.device.mgt.extensions.device.organization.mock.BaseDeviceOrganizationTest; +import io.entgra.device.mgt.core.device.mgt.extensions.device.organization.spi.DeviceOrganizationService; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.testng.Assert; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.Test; + +public class ServiceNegativeTest extends BaseDeviceOrganizationTest { + + private static final Log log = LogFactory.getLog(ServiceNegativeTest.class); + + private DeviceOrganizationService deviceOrganizationService; + + @BeforeClass + public void init() { + deviceOrganizationService = new DeviceOrganizationServiceImpl(); + log.info("Service test initialized"); + } + + @Test(description = "This method tests Get Children Of method under negative circumstances with negative deviceId", + expectedExceptions = {DeviceOrganizationMgtPluginException.class}) + public void testGetChildrenOfWithInvalidInput() throws DeviceOrganizationMgtPluginException { + int deviceId = -1; + int maxDepth = -1; + boolean includeDevice = true; + deviceOrganizationService.getChildrenOfDeviceNode(deviceId, maxDepth, includeDevice); + } + + @Test(description = "This method tests Get Children Of method under negative circumstances with an invalid deviceId", + expectedExceptions = {DeviceOrganizationMgtPluginException.class}) + public void testGetChildrenOfWithInvalidDeviceNode() throws DeviceOrganizationMgtPluginException { + int deviceId = 0; + int maxDepth = 2; + boolean includeDevice = true; + deviceOrganizationService.getChildrenOfDeviceNode(deviceId, maxDepth, includeDevice); + } + + @Test(description = "This method tests Get Parents Of method under negative circumstances with invalid data", + expectedExceptions = {DeviceOrganizationMgtPluginException.class}) + public void testGetParentsOfWithInvalidInput() throws DeviceOrganizationMgtPluginException { + int deviceID = 0; + int maxDepth = -1; + boolean includeDevice = true; + deviceOrganizationService.getParentsOfDeviceNode(deviceID, maxDepth, includeDevice); + } + + @Test(description = "This method tests Get Parents Of method under negative circumstances with an invalid ID" + , expectedExceptions = {DeviceOrganizationMgtPluginException.class}) + public void testGetParentsOfWithInvalidDeviceNode() throws DeviceOrganizationMgtPluginException { + int deviceID = -2; + int maxDepth = 2; + boolean includeDevice = true; + deviceOrganizationService.getParentsOfDeviceNode(deviceID, maxDepth, includeDevice); + } + + @Test(description = "This method tests Get Parents Of method under negative circumstances with an invalid DeviceNode" + , expectedExceptions = {DeviceOrganizationMgtPluginException.class} + ) + public void testGetParentsOfWithNullDeviceNode() throws DeviceOrganizationMgtPluginException { + int deviceID = -1; + int maxDepth = 2; + boolean includeDevice = true; + deviceOrganizationService.getParentsOfDeviceNode(deviceID, maxDepth, includeDevice); + } + + + @Test(description = "This method tests Add Device Organization method under negative circumstances with null data", + expectedExceptions = {DeviceOrganizationMgtPluginException.class}) + public void testAddDeviceOrganizationWithInvalidInput() throws DeviceOrganizationMgtPluginException { + DeviceOrganization invalidOrganization = new DeviceOrganization(); + deviceOrganizationService.addDeviceOrganization(invalidOrganization); + } + + @Test(description = "This method tests Add Device Organization method under negative circumstances with invalid" + + "parent ID", + expectedExceptions = {DeviceOrganizationMgtPluginException.class}) + public void testAddDeviceOrganizationWithInvalidParentID() throws DeviceOrganizationMgtPluginException { + + DeviceOrganization deviceOrganizationOne = new DeviceOrganization(); + deviceOrganizationOne.setDeviceId(3); + deviceOrganizationOne.setParentDeviceId(30); + deviceOrganizationOne.setDeviceOrganizationMeta("Physical Relationship"); + + boolean result1 = deviceOrganizationService.addDeviceOrganization(deviceOrganizationOne); + } + + @Test(description = "This method tests Add Device Organization method under negative circumstances with invalid" + + "child ID", + expectedExceptions = {DeviceOrganizationMgtPluginException.class}) + public void testAddDeviceOrganizationWithInvalidChildID() throws DeviceOrganizationMgtPluginException { + + DeviceOrganization deviceOrganizationOne = new DeviceOrganization(); + deviceOrganizationOne.setDeviceId(30); + deviceOrganizationOne.setParentDeviceId(3); + deviceOrganizationOne.setDeviceOrganizationMeta("Physical Relationship"); + boolean result1 = deviceOrganizationService.addDeviceOrganization(deviceOrganizationOne); + + } + + @Test(description = "This method tests isDeviceOrganizationExist method under negative circumstances with an organization that doesn't exist") + public void testOrganizationDoesNotExist() throws DeviceOrganizationMgtPluginException { + int nonExistentDeviceId = 9999; // An ID that doesn't exist + int nonExistentParentDeviceId = 8888; // An ID that doesn't exist + boolean exists = deviceOrganizationService.isDeviceOrganizationExist(nonExistentDeviceId, nonExistentParentDeviceId); + Assert.assertFalse(exists, "Organization should not exist for non-existent IDs."); + } + + @Test(description = "This method tests Exception Handling when adding a duplicate Device Organization", + expectedExceptions = {DeviceOrganizationMgtPluginException.class}) + public void testAddDuplicateDeviceOrganization() throws DeviceOrganizationMgtPluginException { + // Create a valid organization + DeviceOrganization validOrganization = new DeviceOrganization(); + validOrganization.setDeviceId(1); + validOrganization.setParentDeviceId(0); + + try { + // Add the organization once + deviceOrganizationService.addDeviceOrganization(validOrganization); + + // Attempt to add the same organization again, which should throw an exception + deviceOrganizationService.addDeviceOrganization(validOrganization); + } finally { + // Clean up: Delete the added organization if it was successfully added to avoid conflicts in future tests + deviceOrganizationService.deleteDeviceAssociations(validOrganization.getDeviceId()); + } + } + + @Test(description = "This method tests Update Device Organization method under negative circumstances with null " + + "data", expectedExceptions = {DeviceOrganizationMgtPluginException.class}) + public void testUpdateDeviceOrganizationWithInvalidInput() throws DeviceOrganizationMgtPluginException { + DeviceOrganization invalidOrganization = new DeviceOrganization(); + deviceOrganizationService.updateDeviceOrganization(invalidOrganization); + } + + @Test(description = "This method tests Update Device Organization method under negative circumstances with an invalid organization ID", + expectedExceptions = {DeviceOrganizationMgtPluginException.class}) + public void testUpdateDeviceOrganizationWithInvalidID() throws DeviceOrganizationMgtPluginException { + DeviceOrganization invalidOrganization = new DeviceOrganization(); + invalidOrganization.setOrganizationId(-1); // Provide an invalid organization ID + deviceOrganizationService.updateDeviceOrganization(invalidOrganization); + } + + + @Test(description = "This method tests Get Device Organization By ID method under negative circumstances with " + + "invalid input", + expectedExceptions = {DeviceOrganizationMgtPluginException.class}) + public void testGetDeviceOrganizationByIDWithInvalidInput() throws DeviceOrganizationMgtPluginException { + int invalidOrganizationId = 0; + deviceOrganizationService.getDeviceOrganizationByID(invalidOrganizationId); + } + + @Test(description = "This method tests Delete Device Organization By ID method under negative circumstances with " + + "invalid input", expectedExceptions = {DeviceOrganizationMgtPluginException.class}) + public void testDeleteDeviceOrganizationByIDWithInvalidInput() throws DeviceOrganizationMgtPluginException { + int invalidOrganizationId = 0; + deviceOrganizationService.deleteDeviceOrganizationByID(invalidOrganizationId); + } + + @Test(description = "This method tests Does Device ID Exist method under negative circumstances with invalid input", + expectedExceptions = {BadRequestException.class}) + public void testDoesDeviceIdExistWithInvalidInput() throws DeviceOrganizationMgtPluginException { + int invalidDeviceId = 0; + deviceOrganizationService.isDeviceIdExist(invalidDeviceId); + } + + @Test(description = "This method tests Delete Device Associations method under negative circumstances with invalid " + + "input", expectedExceptions = {BadRequestException.class}) + public void testDeleteDeviceAssociationsWithInvalidInput() throws DeviceOrganizationMgtPluginException { + int invalidDeviceId = 0; + deviceOrganizationService.deleteDeviceAssociations(invalidDeviceId); + } + +} diff --git a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/ServiceTest.java b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/ServiceTest.java new file mode 100644 index 0000000000..351b21d537 --- /dev/null +++ b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/ServiceTest.java @@ -0,0 +1,489 @@ +/* + * Copyright (c) 2018 - 2023, 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.device.mgt.extensions.device.organization; + +import io.entgra.device.mgt.core.device.mgt.extensions.device.organization.dao.DeviceOrganizationDAO; +import io.entgra.device.mgt.core.device.mgt.extensions.device.organization.dto.DeviceNodeResult; +import io.entgra.device.mgt.core.device.mgt.extensions.device.organization.dto.DeviceOrganization; +import io.entgra.device.mgt.core.device.mgt.extensions.device.organization.dto.PaginationRequest; +import io.entgra.device.mgt.core.device.mgt.extensions.device.organization.exception.DeviceOrganizationMgtPluginException; +import io.entgra.device.mgt.core.device.mgt.extensions.device.organization.impl.DeviceOrganizationServiceImpl; +import io.entgra.device.mgt.core.device.mgt.extensions.device.organization.mock.BaseDeviceOrganizationTest; +import io.entgra.device.mgt.core.device.mgt.extensions.device.organization.spi.DeviceOrganizationService; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.testng.Assert; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.Test; + +import java.util.Date; +import java.util.List; + +public class ServiceTest extends BaseDeviceOrganizationTest { + + private static final Log log = LogFactory.getLog(ServiceTest.class); + + private DeviceOrganizationService deviceOrganizationService; + private DeviceOrganizationDAO deviceOrganizationDAO; + + @BeforeClass + public void init() { + deviceOrganizationService = new DeviceOrganizationServiceImpl(); + log.info("Service test initialized"); + } + + @Test(dependsOnMethods = "testAddMultipleDeviceOrganizations") + public void testGetChildrenOf() throws DeviceOrganizationMgtPluginException { + boolean exists = deviceOrganizationService.isDeviceIdExist(17); + if (exists) { + int deviceID = 17; + int maxDepth = 10; + boolean includeDevice = true; + DeviceNodeResult childrenList = deviceOrganizationService.getChildrenOfDeviceNode(deviceID, maxDepth, includeDevice); + Assert.assertNotNull(childrenList, "Cannot be null"); + } + } + + @Test(dependsOnMethods = "testAddDeviceOrganizationWithNullParent") + public void testGetChildrenOfWithOneParent() throws DeviceOrganizationMgtPluginException { + boolean exists = deviceOrganizationService.isDeviceIdExist(3); + if (exists) { + int deviceID = 3; + int maxDepth = 4; + boolean includeDevice = true; + DeviceNodeResult childrenList = deviceOrganizationService.getChildrenOfDeviceNode(deviceID, maxDepth, includeDevice); + Assert.assertNotNull(childrenList, "Cannot be null"); + } + } + + @Test(dependsOnMethods = "testAddMultipleDeviceOrganizations") + public void testGetParentsOf() throws DeviceOrganizationMgtPluginException { + boolean exists = deviceOrganizationService.isChildDeviceIdExist(20); + if (exists) { + int deviceID = 20; + int maxDepth = 3; + boolean includeDevice = false; + DeviceNodeResult parentList = deviceOrganizationService.getParentsOfDeviceNode(deviceID, maxDepth, includeDevice); + + Assert.assertNotNull(parentList, "Cannot be null"); + } + } + + @Test() + public void testAddDeviceOrganizationWithoutMetaData() throws DeviceOrganizationMgtPluginException { + + DeviceOrganization deviceOrganizationOne = new DeviceOrganization(); + deviceOrganizationOne.setDeviceId(4); + deviceOrganizationOne.setParentDeviceId(null); + + boolean result1 = deviceOrganizationService.addDeviceOrganization(deviceOrganizationOne); + Assert.assertTrue(result1); + DeviceOrganization organization1 = deviceOrganizationService.getDeviceOrganizationByUniqueKey(4, null); + + Assert.assertNotNull(organization1); + + } + + @Test() + public void testAddDeviceOrganizationWithNullParent() throws DeviceOrganizationMgtPluginException { + + DeviceOrganization deviceOrganizationOne = new DeviceOrganization(); + deviceOrganizationOne.setDeviceId(3); + deviceOrganizationOne.setParentDeviceId(null); + deviceOrganizationOne.setDeviceOrganizationMeta("Physical Relationship"); + + boolean result1 = deviceOrganizationService.addDeviceOrganization(deviceOrganizationOne); + Assert.assertTrue(result1); + DeviceOrganization organization1 = deviceOrganizationService.getDeviceOrganizationByUniqueKey(3, null); + + Assert.assertNotNull(organization1); + + } + + @Test() + public void testAddDeviceOrganization() throws DeviceOrganizationMgtPluginException { + + DeviceOrganization deviceOrganizationOne = new DeviceOrganization(); + deviceOrganizationOne.setDeviceId(3); + deviceOrganizationOne.setParentDeviceId(4); + deviceOrganizationOne.setDeviceOrganizationMeta("Physical Relationship"); + + boolean result1 = deviceOrganizationService.addDeviceOrganization(deviceOrganizationOne); + DeviceOrganization organization = deviceOrganizationService.getDeviceOrganizationByUniqueKey(3, 4); + + Assert.assertTrue(result1 || organization != null); + + } + + @Test() + public void testAddDeviceOrganizationForDelete() throws DeviceOrganizationMgtPluginException { + + DeviceOrganization deviceOrganizationOne = new DeviceOrganization(); + deviceOrganizationOne.setDeviceId(2); + deviceOrganizationOne.setParentDeviceId(null); + deviceOrganizationOne.setDeviceOrganizationMeta("Physical Relationship"); + + boolean result1 = deviceOrganizationService.addDeviceOrganization(deviceOrganizationOne); + DeviceOrganization organization = deviceOrganizationService.getDeviceOrganizationByUniqueKey(2, null); + + Assert.assertTrue(result1 || organization != null); + + } + + @Test() + public void testAddDeviceOrganizationForDeleteAssociations() throws DeviceOrganizationMgtPluginException { + + DeviceOrganization deviceOrganizationOne = new DeviceOrganization(); + deviceOrganizationOne.setDeviceId(1); + deviceOrganizationOne.setParentDeviceId(null); + deviceOrganizationOne.setDeviceOrganizationMeta("Physical Relationship"); + + boolean result1 = deviceOrganizationService.addDeviceOrganization(deviceOrganizationOne); + DeviceOrganization organization = deviceOrganizationService.getDeviceOrganizationByUniqueKey(1, null); + + Assert.assertTrue(result1 || organization != null); + + } + + @Test() + public void testAddMultipleDeviceOrganizations() throws DeviceOrganizationMgtPluginException { + DeviceOrganizationService deviceOrganizationService = new DeviceOrganizationServiceImpl(); + + int[] deviceIds = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20}; + + // Define specific combinations of deviceID and parentDeviceID + int[][] combinations = { + {20, 19}, {19, 18}, {18, 17}, {20, 5}, {20, 17}, {19, 16}, {17, 16}, {16, 17}, {2, 1}, {3, 2} + // Add more combinations as needed + }; + + // Initialize counters for tracking the number of organizations and iterations + int organizationCount = 0; + int iterationCount = 0; + + // Iterate through the defined combinations + for (int[] combination : combinations) { + int childDeviceId = combination[0]; + int parentDeviceId = combination[1]; + + DeviceOrganization organization = new DeviceOrganization(); + organization.setDeviceId(childDeviceId); + organization.setParentDeviceId(parentDeviceId); + + boolean result = deviceOrganizationService.addDeviceOrganization(organization); + + // Optionally, add assertions to check the results if needed + if (result) { + organizationCount++; + } + + iterationCount++; + } + + DeviceOrganization nullParent = new DeviceOrganization(); + nullParent.setDeviceId(1); + nullParent.setParentDeviceId(null); + boolean isNullParentAdded = deviceOrganizationService.addDeviceOrganization(nullParent); + + DeviceOrganization secondNullParent = new DeviceOrganization(); + secondNullParent.setDeviceId(2); + secondNullParent.setParentDeviceId(null); + boolean isSecondNullParentAdded = deviceOrganizationService.addDeviceOrganization(secondNullParent); + + + // Optionally, you can assert that the correct number of organizations were inserted + Assert.assertEquals(organizationCount, combinations.length, "Inserted organizations count mismatch"); + } + + @Test(dependsOnMethods = "testAddDeviceOrganizationWithNullParent") + public void testUpdateDeviceOrganizationWithSameData() throws DeviceOrganizationMgtPluginException { + DeviceOrganization deviceOrganization = new DeviceOrganization(); + deviceOrganization.setDeviceId(3); + deviceOrganization.setParentDeviceId(null); + deviceOrganization.setOrganizationId(1); + + DeviceOrganization organization = deviceOrganizationService.getDeviceOrganizationByID(1); + if (organization != null) { + boolean result = deviceOrganizationService.updateDeviceOrganization(deviceOrganization); + Assert.assertTrue(result); + } + } + + + @Test(dependsOnMethods = "testAddDeviceOrganizationWithNullParent") + public void testUpdateDeviceOrganizationWithDifferentData() throws DeviceOrganizationMgtPluginException { + DeviceOrganization deviceOrganization = new DeviceOrganization(); + deviceOrganization.setDeviceId(3); + deviceOrganization.setParentDeviceId(4); + deviceOrganization.setOrganizationId(1); + + DeviceOrganization organization = deviceOrganizationService.getDeviceOrganizationByID(1); + if (organization != null) { + boolean result = deviceOrganizationService.updateDeviceOrganization(deviceOrganization); + Assert.assertTrue(result); + } + } + + @Test(dependsOnMethods = "testAddDeviceOrganization") + public void testGetDeviceOrganizationByID() throws DeviceOrganizationMgtPluginException { + int organizationID = 1; + DeviceOrganization deviceOrganization = deviceOrganizationService.getDeviceOrganizationByID(organizationID); + if (deviceOrganization != null) { + log.info("In Device Organization with organizationID = " + organizationID + + ", deviceID = " + deviceOrganization.getDeviceId() + + ", ParentDeviceID = " + deviceOrganization.getParentDeviceId() + + ", Meta Data = " + deviceOrganization.getDeviceOrganizationMeta() + ); + } + } + + @Test(dependsOnMethods = "testAddDeviceOrganization") + public void testDoesDeviceIdExist() throws DeviceOrganizationMgtPluginException { + boolean deviceIdExist = deviceOrganizationService.isDeviceIdExist(4); + Assert.assertTrue(deviceIdExist); + } + + @Test(dependsOnMethods = "testAddDeviceOrganizationForDelete") + public void testDeleteDeviceOrganizationByID() throws DeviceOrganizationMgtPluginException { + boolean rs = deviceOrganizationService.deleteDeviceOrganizationByID(1); + + } + + @Test(dependsOnMethods = "testAddDeviceOrganizationForDeleteAssociations") + public void testDeleteDeviceAssociations() throws DeviceOrganizationMgtPluginException { + boolean rs = deviceOrganizationService.deleteDeviceAssociations(1); + Assert.assertTrue(rs); + } + + @Test(dependsOnMethods = "testAddDeviceOrganization") + public void testGetAllOrganizations() throws DeviceOrganizationMgtPluginException { + List organizations = deviceOrganizationService.getAllDeviceOrganizations(); + for (DeviceOrganization organization : organizations) { + log.info("organizationID = " + organization.getOrganizationId()); + log.info("deviceID = " + organization.getDeviceId()); + log.info("parentDeviceID = " + organization.getParentDeviceId()); + log.info("updateTime = " + organization.getUpdateTime()); + log.info("----------------------------------------------"); + } + Assert.assertNotNull(organizations, "List of organizations cannot be null"); + Assert.assertFalse(organizations.isEmpty(), "List of organizations should not be empty"); + } + + @Test(dependsOnMethods = "testAddDeviceOrganizationWithNullParent") + public void testGetRootOrganizations() throws DeviceOrganizationMgtPluginException { + int offset = 0; + int limit = 10; + PaginationRequest request = new PaginationRequest(offset, limit); + List organizations = deviceOrganizationService.getDeviceOrganizationRoots(request); + for (DeviceOrganization organization : organizations) { + log.info("organizationID = " + organization.getOrganizationId()); + log.info("deviceID = " + organization.getDeviceId()); + log.info("parentDeviceID = " + organization.getParentDeviceId()); + log.info("updateTime = " + organization.getUpdateTime()); + log.info("deviceSerial = " + organization.getDevice().getDeviceIdentifier()); + log.info("----------------------------------------------"); + } + Assert.assertNotNull(organizations, "List of organizations cannot be null"); + Assert.assertFalse(organizations.isEmpty(), "List of organizations should not be empty"); + } + + @Test(dependsOnMethods = "testAddMultipleDeviceOrganizations") + public void testGetMultipleRootOrganizations() throws DeviceOrganizationMgtPluginException { + int offset = 0; + int limit = 10; + PaginationRequest request = new PaginationRequest(offset, limit); + List organizations = deviceOrganizationService.getDeviceOrganizationRoots(request); + for (DeviceOrganization organization : organizations) { + log.info("organizationID = " + organization.getOrganizationId()); + log.info("deviceID = " + organization.getDeviceId()); + log.info("parentDeviceID = " + organization.getParentDeviceId()); + log.info("updateTime = " + organization.getUpdateTime()); + log.info("deviceSerial = " + organization.getDevice().getDeviceIdentifier()); + log.info("----------------------------------------------"); + } + Assert.assertNotNull(organizations, "List of organizations cannot be null"); + Assert.assertFalse(organizations.isEmpty(), "List of organizations should not be empty"); + } + + @Test(dependsOnMethods = "testAddMultipleDeviceOrganizations") + public void testGetLeafOrganizationsWithMultipleDeviceOrganizations() throws DeviceOrganizationMgtPluginException { + int offset = 0; + int limit = 10; + PaginationRequest request = new PaginationRequest(offset, limit); + List organizations = deviceOrganizationService.getDeviceOrganizationLeafs(request); + for (DeviceOrganization organization : organizations) { + log.info("organizationID = " + organization.getOrganizationId()); + log.info("deviceID = " + organization.getDeviceId()); + log.info("parentDeviceID = " + organization.getParentDeviceId()); + log.info("updateTime = " + organization.getUpdateTime()); + log.info("----------------------------------------------"); + } + Assert.assertFalse(organizations.isEmpty(), "List of organizations should not be empty"); + } + + @Test(dependsOnMethods = "testAddDeviceOrganization") + public void testGetLeafOrganizations() throws DeviceOrganizationMgtPluginException { + int offset = 0; + int limit = 10; + PaginationRequest request = new PaginationRequest(offset, limit); + List organizations = deviceOrganizationService.getDeviceOrganizationLeafs(request); + for (DeviceOrganization organization : organizations) { + log.info("organizationID = " + organization.getOrganizationId()); + log.info("deviceID = " + organization.getDeviceId()); + log.info("parentDeviceID = " + organization.getParentDeviceId()); + log.info("updateTime = " + organization.getUpdateTime()); + log.info("----------------------------------------------"); + } + Assert.assertNotNull(organizations, "List of organizations cannot be null"); + } + + @Test(dependsOnMethods = "testAddMultipleDeviceOrganizations") + public void testGetDeviceOrganizationByUniqueKey() throws DeviceOrganizationMgtPluginException { + int deviceID = 20; + int parentDeviceID = 19; + + DeviceOrganization organization = deviceOrganizationService.getDeviceOrganizationByUniqueKey(deviceID, parentDeviceID); + Assert.assertNotNull(organization, "Organization should not be null"); + Assert.assertEquals(organization.getDeviceId(), deviceID, "Device ID should match"); + Assert.assertEquals(organization.getParentDeviceId().intValue(), parentDeviceID, "Parent Device ID should match"); + } + + @Test + public void testIsCyclicRelationshipExistWithoutCheck() throws DeviceOrganizationMgtPluginException { + + // Add all devices + deviceOrganizationService.addAllDevices(); + + int start =52; + int end =100; + // Add organizations + deviceOrganizationService.addOrganizations(start, end); + + // Test cyclic relationship check + int newSourceNode = 51; + int newTargetNode = 100; + + DeviceOrganization deviceOrganization = new DeviceOrganization(); + deviceOrganization.setDeviceId(newTargetNode); + deviceOrganization.setParentDeviceId(newSourceNode); + deviceOrganization.setUpdateTime(new Date(System.currentTimeMillis())); + + try { + boolean isInserted = deviceOrganizationService.addDeviceOrganization(deviceOrganization); + Assert.assertTrue(isInserted, "Cyclic relationship not detected. Row Inserted."); + } catch (DeviceOrganizationMgtPluginException e) { + // Handle exceptions or log errors as needed + e.printStackTrace(); + Assert.fail("Exception occurred during the test: " + e.getMessage()); + } + } + + @Test + public void testIsCyclicRelationshipExistWithCheck() throws DeviceOrganizationMgtPluginException { + + // Add all devices + deviceOrganizationService.addAllDevices(); + + int start =102; + int end =200; + // Add organizations + deviceOrganizationService.addOrganizations(start, end); + + // Test cyclic relationship check + int newSourceNode = 101; + int newTargetNode = 200; + + DeviceOrganization deviceOrganization = new DeviceOrganization(); + deviceOrganization.setDeviceId(newTargetNode); + deviceOrganization.setParentDeviceId(newSourceNode); + deviceOrganization.setUpdateTime(new Date(System.currentTimeMillis())); + deviceOrganization.setCheckCyclicRelationship(true); + + try { + boolean isInserted = deviceOrganizationService.addDeviceOrganization(deviceOrganization); + Assert.assertTrue(isInserted, "Cyclic relationship not detected. Row Inserted."); + } catch (DeviceOrganizationMgtPluginException e) { + // Handle exceptions or log errors as needed + e.printStackTrace(); + Assert.fail("Exception occurred during the test: " + e.getMessage()); + } + } + + + @Test + public void testIsCyclicRelationshipExistForDirectRelationships() throws DeviceOrganizationMgtPluginException { + + // Add all devices + deviceOrganizationService.addAllDevices(); + + int start =202; + int end =300; + // Add organizations + deviceOrganizationService.addOrganizations(start, end); + + + // Test cyclic relationship check + int newSourceNode = 300; + int newTargetNode = 299; + DeviceOrganization deviceOrganization = new DeviceOrganization(); + deviceOrganization.setDeviceId(newTargetNode); + deviceOrganization.setParentDeviceId(newSourceNode); + deviceOrganization.setUpdateTime(new Date(System.currentTimeMillis())); + deviceOrganization.setCheckCyclicRelationship(true); + try { + boolean isInserted = deviceOrganizationService.addDeviceOrganization(deviceOrganization); + Assert.assertFalse(isInserted, "Cyclic relationship detected. Insertion not allowed."); + } catch (DeviceOrganizationMgtPluginException e) { + // Handle exceptions or log errors as needed + e.printStackTrace(); + Assert.fail("Exception occurred during the test: " + e.getMessage()); + } + } + + // + @Test + public void testIsCyclicRelationshipExistForIndirectRelationships() throws DeviceOrganizationMgtPluginException { + + // Add all devices + deviceOrganizationService.addAllDevices(); + + int start =302; + int end =500; + // Add organizations + deviceOrganizationService.addOrganizations(start, end); + + // Test cyclic relationship check + int newSourceNode = 500; + int newTargetNode = 301; + DeviceOrganization deviceOrganization = new DeviceOrganization(); + deviceOrganization.setDeviceId(newTargetNode); + deviceOrganization.setParentDeviceId(newSourceNode); + deviceOrganization.setUpdateTime(new Date(System.currentTimeMillis())); + deviceOrganization.setCheckCyclicRelationship(true); + try { + boolean isInserted = deviceOrganizationService.addDeviceOrganization(deviceOrganization); + Assert.assertFalse(isInserted, "Cyclic relationship detected. Insertion not allowed."); + } catch (DeviceOrganizationMgtPluginException e) { + // Handle exceptions or log errors as needed + e.printStackTrace(); + Assert.fail("Exception occurred during the test: " + e.getMessage()); + } + } + +} diff --git a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/TestUtils.java b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/TestUtils.java new file mode 100644 index 0000000000..9dcac705be --- /dev/null +++ b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/TestUtils.java @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2018 - 2023, 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.device.mgt.extensions.device.organization; + +import io.entgra.device.mgt.core.device.mgt.extensions.device.organization.dao.util.ConnectionManagerUtil; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import java.sql.Connection; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; + +public class TestUtils { + + private static final Log log = LogFactory.getLog(TestUtils.class); + + public static void cleanupResources(Connection conn, Statement stmt, ResultSet rs) { + if (rs != null) { + try { + rs.close(); + } catch (SQLException e) { + log.warn("Error occurred while closing result set", e); + } + } + if (stmt != null) { + try { + stmt.close(); + } catch (SQLException e) { + log.warn("Error occurred while closing prepared statement", e); + } + } + if (conn != null) { + ConnectionManagerUtil.closeDBConnection(); + } + } +} diff --git a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/mock/BaseDeviceOrganizationTest.java b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/mock/BaseDeviceOrganizationTest.java new file mode 100644 index 0000000000..ec7cf1efe5 --- /dev/null +++ b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/mock/BaseDeviceOrganizationTest.java @@ -0,0 +1,161 @@ +/* + * Copyright (c) 2018 - 2023, 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.device.mgt.extensions.device.organization.mock; + +import io.entgra.device.mgt.core.device.mgt.common.DeviceManagementConstants; +import io.entgra.device.mgt.core.device.mgt.common.exceptions.DeviceManagementException; +import io.entgra.device.mgt.core.device.mgt.core.util.DeviceManagerUtil; +import io.entgra.device.mgt.core.device.mgt.extensions.device.organization.DataSourceConfig; +import io.entgra.device.mgt.core.device.mgt.extensions.device.organization.TestUtils; +import io.entgra.device.mgt.core.device.mgt.extensions.device.organization.dao.DeviceOrganizationDAOFactory; +import io.entgra.device.mgt.core.device.mgt.extensions.device.organization.dao.util.ConnectionManagerUtil; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.tomcat.jdbc.pool.PoolProperties; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.BeforeSuite; +import org.testng.annotations.Optional; +import org.testng.annotations.Parameters; +import org.w3c.dom.Document; +import org.wso2.carbon.base.MultitenantConstants; +import org.wso2.carbon.context.PrivilegedCarbonContext; + +import javax.sql.DataSource; +import javax.xml.bind.JAXBContext; +import javax.xml.bind.JAXBException; +import javax.xml.bind.Unmarshaller; +import java.io.File; +import java.lang.reflect.Field; +import java.sql.Connection; +import java.sql.Statement; + +public abstract class BaseDeviceOrganizationTest { + + private static final Log log = LogFactory.getLog(BaseDeviceOrganizationTest.class); + + private static final String datasourceLocation = "src/test/resources/carbon-home/repository/conf/" + + "datasources/data-source-config.xml"; + +// private static final String datasourceLocation = "src/test/resources/config/datasource/mysql/" + +// "data-source-config.xml"; + + + private static boolean mock; + + @BeforeSuite + @Parameters({"isMock"}) + public void setup(@Optional("false") boolean isMock) throws Exception { + log.info("Setting up test suite"); + this.initDataSource(); + this.initSQLScript(); + this.initializeCarbonContext(); + this.initServices(); + mock = isMock; + log.info("Setting up test suite done!"); + } + + protected void initDataSource() throws Exception { + DataSource dataSource = this.getDataSource(this.readDataSourceConfig()); + Class clazz1 = ConnectionManagerUtil.class; + Field f1 = clazz1.getDeclaredField("dataSource"); + f1.setAccessible(true); + f1.set(clazz1, dataSource); + + Class clazz2 = DeviceOrganizationDAOFactory.class; + Field f2 = clazz2.getDeclaredField("databaseEngine"); + f2.setAccessible(true); + f2.set(clazz2, DeviceManagementConstants.DataBaseTypes.DB_TYPE_H2); + } + + private void initServices() { + + } + + @BeforeClass + public abstract void init() throws Exception; + + protected DataSource getDataSource(DataSourceConfig config) { + if (!isMock()) { + PoolProperties properties = new PoolProperties(); + properties.setUrl(config.getUrl()); + properties.setDriverClassName(config.getDriverClassName()); + properties.setUsername(config.getUser()); + properties.setPassword(config.getPassword()); + return new org.apache.tomcat.jdbc.pool.DataSource(properties); + } else { + return new MockDataSource(config.getUrl()); + } + } + + private void initializeCarbonContext() { + if (System.getProperty("carbon.home") == null) { + File file = new File("src/test/resources/carbon-home"); + if (file.exists()) { + System.setProperty("carbon.home", file.getAbsolutePath()); + } + file = new File("../resources/carbon-home"); + if (file.exists()) { + System.setProperty("carbon.home", file.getAbsolutePath()); + } + file = new File("../../resources/carbon-home"); + if (file.exists()) { + System.setProperty("carbon.home", file.getAbsolutePath()); + } + file = new File("../../../resources/carbon-home"); + if (file.exists()) { + System.setProperty("carbon.home", file.getAbsolutePath()); + } + } + + PrivilegedCarbonContext.getThreadLocalCarbonContext().setTenantDomain(MultitenantConstants + .SUPER_TENANT_DOMAIN_NAME); + PrivilegedCarbonContext.getThreadLocalCarbonContext().setTenantId(MultitenantConstants.SUPER_TENANT_ID); + } + + protected DataSourceConfig readDataSourceConfig() throws DeviceManagementException { + try { + File file = new File(BaseDeviceOrganizationTest.datasourceLocation); + Document doc = DeviceManagerUtil.convertToDocument(file); + JAXBContext testDBContext = JAXBContext.newInstance(DataSourceConfig.class); + Unmarshaller unmarshaller = testDBContext.createUnmarshaller(); + return (DataSourceConfig) unmarshaller.unmarshal(doc); + } catch (JAXBException e) { + throw new DeviceManagementException("Error occurred while reading data source configuration", e); + } + } + + private void initSQLScript() throws Exception { + Connection conn = null; + Statement stmt = null; + try { + ConnectionManagerUtil.beginDBTransaction(); + conn = ConnectionManagerUtil.getDBConnection(); + stmt = conn.createStatement(); + stmt.executeUpdate("RUNSCRIPT FROM './src/test/resources/carbon-home/dbscripts/dm-db-h2.sql'"); + stmt.executeUpdate("RUNSCRIPT FROM './src/test/resources/carbon-home/dbscripts/h2.sql'"); + } finally { + TestUtils.cleanupResources(conn, stmt, null); + } + } + + protected boolean isMock() { + return mock; + } + +} diff --git a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/mock/MockConnection.java b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/mock/MockConnection.java new file mode 100644 index 0000000000..86db883873 --- /dev/null +++ b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/mock/MockConnection.java @@ -0,0 +1,343 @@ +/* + * Copyright (c) 2018 - 2023, 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.device.mgt.extensions.device.organization.mock; + +import java.sql.Array; +import java.sql.Blob; +import java.sql.CallableStatement; +import java.sql.Clob; +import java.sql.Connection; +import java.sql.DatabaseMetaData; +import java.sql.NClob; +import java.sql.PreparedStatement; +import java.sql.SQLClientInfoException; +import java.sql.SQLException; +import java.sql.SQLWarning; +import java.sql.SQLXML; +import java.sql.Savepoint; +import java.sql.Statement; +import java.sql.Struct; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Properties; +import java.util.concurrent.Executor; + +/** + * This is mock class which provides mock database connection. + */ + +public class MockConnection implements Connection { + + private final String url; + private final List statements = new ArrayList<>(); + private int statementCounter = 0; + + public MockConnection(String url) { + this.url = url; + } + + @Override + public Statement createStatement() throws SQLException { + return getStatement(); + } + + private MockStatement getStatement() { + if (!statements.isEmpty()) { + MockStatement statement = this.statements.get(this.statementCounter); + statementCounter++; + return statement; + } + return new MockStatement(); + } + + @Override + public PreparedStatement prepareStatement(String sql) throws SQLException { + return getStatement(); + } + + @Override + public CallableStatement prepareCall(String sql) throws SQLException { + return null; + } + + @Override + public String nativeSQL(String sql) throws SQLException { + return null; + } + + @Override + public boolean getAutoCommit() throws SQLException { + return false; + } + + @Override + public void setAutoCommit(boolean autoCommit) throws SQLException { + + } + + @Override + public void commit() throws SQLException { + + } + + @Override + public void rollback() throws SQLException { + + } + + @Override + public void close() throws SQLException { + + } + + @Override + public boolean isClosed() throws SQLException { + return false; + } + + @Override + public DatabaseMetaData getMetaData() throws SQLException { + return new MockDatabaseMetaData(this.url); + } + + @Override + public boolean isReadOnly() throws SQLException { + return false; + } + + @Override + public void setReadOnly(boolean readOnly) throws SQLException { + + } + + @Override + public String getCatalog() throws SQLException { + return null; + } + + @Override + public void setCatalog(String catalog) throws SQLException { + + } + + @Override + public int getTransactionIsolation() throws SQLException { + return 0; + } + + @Override + public void setTransactionIsolation(int level) throws SQLException { + + } + + @Override + public SQLWarning getWarnings() throws SQLException { + return null; + } + + @Override + public void clearWarnings() throws SQLException { + + } + + @Override + public Statement createStatement(int resultSetType, int resultSetConcurrency) throws SQLException { + return null; + } + + @Override + public PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency) + throws SQLException { + return null; + } + + @Override + public CallableStatement prepareCall(String sql, int resultSetType, int resultSetConcurrency) + throws SQLException { + return null; + } + + @Override + public Map> getTypeMap() throws SQLException { + return null; + } + + @Override + public void setTypeMap(Map> map) throws SQLException { + + } + + @Override + public int getHoldability() throws SQLException { + return 0; + } + + @Override + public void setHoldability(int holdability) throws SQLException { + + } + + @Override + public Savepoint setSavepoint() throws SQLException { + return null; + } + + @Override + public Savepoint setSavepoint(String name) throws SQLException { + return null; + } + + @Override + public void rollback(Savepoint savepoint) throws SQLException { + + } + + @Override + public void releaseSavepoint(Savepoint savepoint) throws SQLException { + + } + + @Override + public Statement createStatement(int resultSetType, int resultSetConcurrency, int resultSetHoldability) + throws SQLException { + return null; + } + + @Override + public PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency, + int resultSetHoldability) throws SQLException { + return null; + } + + @Override + public CallableStatement prepareCall(String sql, int resultSetType, int resultSetConcurrency, + int resultSetHoldability) throws SQLException { + return null; + } + + @Override + public PreparedStatement prepareStatement(String sql, int autoGeneratedKeys) throws SQLException { + return null; + } + + @Override + public PreparedStatement prepareStatement(String sql, int[] columnIndexes) throws SQLException { + return null; + } + + @Override + public PreparedStatement prepareStatement(String sql, String[] columnNames) throws SQLException { + return new MockStatement(); + } + + @Override + public Clob createClob() throws SQLException { + return null; + } + + @Override + public Blob createBlob() throws SQLException { + return null; + } + + @Override + public NClob createNClob() throws SQLException { + return null; + } + + @Override + public SQLXML createSQLXML() throws SQLException { + return null; + } + + @Override + public boolean isValid(int timeout) throws SQLException { + return false; + } + + @Override + public void setClientInfo(String name, String value) throws SQLClientInfoException { + + } + + @Override + public String getClientInfo(String name) throws SQLException { + return null; + } + + @Override + public Properties getClientInfo() throws SQLException { + return null; + } + + @Override + public void setClientInfo(Properties properties) throws SQLClientInfoException { + + } + + @Override + public Array createArrayOf(String typeName, Object[] elements) throws SQLException { + return null; + } + + @Override + public Struct createStruct(String typeName, Object[] attributes) throws SQLException { + return null; + } + + @Override + public String getSchema() throws SQLException { + return null; + } + + @Override + public void setSchema(String schema) throws SQLException { + + } + + @Override + public void abort(Executor executor) throws SQLException { + + } + + @Override + public void setNetworkTimeout(Executor executor, int milliseconds) throws SQLException { + + } + + @Override + public int getNetworkTimeout() throws SQLException { + return 0; + } + + @Override + public T unwrap(Class iface) throws SQLException { + return null; + } + + @Override + public boolean isWrapperFor(Class iface) throws SQLException { + return false; + } + + public void addMockStatement(MockStatement mockStatement) { + this.statements.add(mockStatement); + } + +} diff --git a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/mock/MockDataSource.java b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/mock/MockDataSource.java new file mode 100644 index 0000000000..8b266cd85f --- /dev/null +++ b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/mock/MockDataSource.java @@ -0,0 +1,123 @@ +/* + * Copyright (c) 2018 - 2023, 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.device.mgt.extensions.device.organization.mock; + +import javax.sql.DataSource; +import java.io.PrintWriter; +import java.sql.Connection; +import java.sql.SQLException; +import java.sql.SQLFeatureNotSupportedException; +import java.util.ArrayList; +import java.util.List; +import java.util.logging.Logger; + +/** + * This is the mock data source implementation that will be used in the test cases. + */ +public class MockDataSource implements DataSource { + private final List connections = new ArrayList<>(); + private final String url; + private boolean throwException = false; + private int connectionCounter = 0; + + public MockDataSource(String url) { + this.url = url; + } + + @Override + public Connection getConnection() throws SQLException { + if (throwException) { + throw new SQLException("Cannot created test connection."); + } else { + if (!connections.isEmpty()) { + if (this.connectionCounter < this.connections.size()) { + Connection connection = this.connections.get(this.connectionCounter); + this.connectionCounter++; + return connection; + } else { + return new MockConnection(url); + } + } + return new MockConnection(url); + } + } + + public void setConnection(Connection connection) { + this.connections.add(connection); + } + + @Override + public Connection getConnection(String username, String password) throws SQLException { + return null; + } + + @Override + public T unwrap(Class iface) throws SQLException { + return null; + } + + @Override + public boolean isWrapperFor(Class iface) throws SQLException { + return false; + } + + @Override + public PrintWriter getLogWriter() throws SQLException { + return null; + } + + @Override + public void setLogWriter(PrintWriter out) throws SQLException { + + } + + @Override + public int getLoginTimeout() throws SQLException { + return 0; + } + + @Override + public void setLoginTimeout(int seconds) throws SQLException { + + } + + @Override + public Logger getParentLogger() throws SQLFeatureNotSupportedException { + return null; + } + + public void setThrowException(boolean throwException) { + this.throwException = throwException; + } + + public void reset() { + this.throwException = false; + this.connections.clear(); + this.connectionCounter = 0; + } + + public String getUrl() { + return this.url; + } + + public MockConnection getConnection(int id) { + return (MockConnection) this.connections.get(id); + } + +} diff --git a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/mock/MockDatabaseMetaData.java b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/mock/MockDatabaseMetaData.java new file mode 100644 index 0000000000..a1229e28a4 --- /dev/null +++ b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/mock/MockDatabaseMetaData.java @@ -0,0 +1,941 @@ +/* + * Copyright (c) 2018 - 2023, 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.device.mgt.extensions.device.organization.mock; + +import io.entgra.device.mgt.core.device.mgt.common.DeviceManagementConstants; + +import java.sql.Connection; +import java.sql.DatabaseMetaData; +import java.sql.ResultSet; +import java.sql.RowIdLifetime; +import java.sql.SQLException; + +public class MockDatabaseMetaData implements DatabaseMetaData { + private final String url; + + public MockDatabaseMetaData(String url) { + this.url = url; + } + + @Override + public boolean allProceduresAreCallable() throws SQLException { + return false; + } + + @Override + public boolean allTablesAreSelectable() throws SQLException { + return false; + } + + @Override + public String getURL() throws SQLException { + return null; + } + + @Override + public String getUserName() throws SQLException { + return null; + } + + @Override + public boolean isReadOnly() throws SQLException { + return false; + } + + @Override + public boolean nullsAreSortedHigh() throws SQLException { + return false; + } + + @Override + public boolean nullsAreSortedLow() throws SQLException { + return false; + } + + @Override + public boolean nullsAreSortedAtStart() throws SQLException { + return false; + } + + @Override + public boolean nullsAreSortedAtEnd() throws SQLException { + return false; + } + + @Override + public String getDatabaseProductName() throws SQLException { + if (this.url.contains("mysql")) { + return DeviceManagementConstants.DataBaseTypes.DB_TYPE_MYSQL; + } else if (this.url.contains("h2")) { + return DeviceManagementConstants.DataBaseTypes.DB_TYPE_H2; + } else if (this.url.contains("oracle")) { + return DeviceManagementConstants.DataBaseTypes.DB_TYPE_ORACLE; + } else if (this.url.contains("postgresql")) { + return DeviceManagementConstants.DataBaseTypes.DB_TYPE_POSTGRESQL; + } else if (this.url.contains("sqlserver")) { + return DeviceManagementConstants.DataBaseTypes.DB_TYPE_MSSQL; + } else { + return null; + } + } + + @Override + public String getDatabaseProductVersion() throws SQLException { + return null; + } + + @Override + public String getDriverName() throws SQLException { + return null; + } + + @Override + public String getDriverVersion() throws SQLException { + return null; + } + + @Override + public int getDriverMajorVersion() { + return 0; + } + + @Override + public int getDriverMinorVersion() { + return 0; + } + + @Override + public boolean usesLocalFiles() throws SQLException { + return false; + } + + @Override + public boolean usesLocalFilePerTable() throws SQLException { + return false; + } + + @Override + public boolean supportsMixedCaseIdentifiers() throws SQLException { + return false; + } + + @Override + public boolean storesUpperCaseIdentifiers() throws SQLException { + return false; + } + + @Override + public boolean storesLowerCaseIdentifiers() throws SQLException { + return false; + } + + @Override + public boolean storesMixedCaseIdentifiers() throws SQLException { + return false; + } + + @Override + public boolean supportsMixedCaseQuotedIdentifiers() throws SQLException { + return false; + } + + @Override + public boolean storesUpperCaseQuotedIdentifiers() throws SQLException { + return false; + } + + @Override + public boolean storesLowerCaseQuotedIdentifiers() throws SQLException { + return false; + } + + @Override + public boolean storesMixedCaseQuotedIdentifiers() throws SQLException { + return false; + } + + @Override + public String getIdentifierQuoteString() throws SQLException { + return null; + } + + @Override + public String getSQLKeywords() throws SQLException { + return null; + } + + @Override + public String getNumericFunctions() throws SQLException { + return null; + } + + @Override + public String getStringFunctions() throws SQLException { + return null; + } + + @Override + public String getSystemFunctions() throws SQLException { + return null; + } + + @Override + public String getTimeDateFunctions() throws SQLException { + return null; + } + + @Override + public String getSearchStringEscape() throws SQLException { + return null; + } + + @Override + public String getExtraNameCharacters() throws SQLException { + return null; + } + + @Override + public boolean supportsAlterTableWithAddColumn() throws SQLException { + return false; + } + + @Override + public boolean supportsAlterTableWithDropColumn() throws SQLException { + return false; + } + + @Override + public boolean supportsColumnAliasing() throws SQLException { + return false; + } + + @Override + public boolean nullPlusNonNullIsNull() throws SQLException { + return false; + } + + @Override + public boolean supportsConvert() throws SQLException { + return false; + } + + @Override + public boolean supportsConvert(int fromType, int toType) throws SQLException { + return false; + } + + @Override + public boolean supportsTableCorrelationNames() throws SQLException { + return false; + } + + @Override + public boolean supportsDifferentTableCorrelationNames() throws SQLException { + return false; + } + + @Override + public boolean supportsExpressionsInOrderBy() throws SQLException { + return false; + } + + @Override + public boolean supportsOrderByUnrelated() throws SQLException { + return false; + } + + @Override + public boolean supportsGroupBy() throws SQLException { + return false; + } + + @Override + public boolean supportsGroupByUnrelated() throws SQLException { + return false; + } + + @Override + public boolean supportsGroupByBeyondSelect() throws SQLException { + return false; + } + + @Override + public boolean supportsLikeEscapeClause() throws SQLException { + return false; + } + + @Override + public boolean supportsMultipleResultSets() throws SQLException { + return false; + } + + @Override + public boolean supportsMultipleTransactions() throws SQLException { + return false; + } + + @Override + public boolean supportsNonNullableColumns() throws SQLException { + return false; + } + + @Override + public boolean supportsMinimumSQLGrammar() throws SQLException { + return false; + } + + @Override + public boolean supportsCoreSQLGrammar() throws SQLException { + return false; + } + + @Override + public boolean supportsExtendedSQLGrammar() throws SQLException { + return false; + } + + @Override + public boolean supportsANSI92EntryLevelSQL() throws SQLException { + return false; + } + + @Override + public boolean supportsANSI92IntermediateSQL() throws SQLException { + return false; + } + + @Override + public boolean supportsANSI92FullSQL() throws SQLException { + return false; + } + + @Override + public boolean supportsIntegrityEnhancementFacility() throws SQLException { + return false; + } + + @Override + public boolean supportsOuterJoins() throws SQLException { + return false; + } + + @Override + public boolean supportsFullOuterJoins() throws SQLException { + return false; + } + + @Override + public boolean supportsLimitedOuterJoins() throws SQLException { + return false; + } + + @Override + public String getSchemaTerm() throws SQLException { + return null; + } + + @Override + public String getProcedureTerm() throws SQLException { + return null; + } + + @Override + public String getCatalogTerm() throws SQLException { + return null; + } + + @Override + public boolean isCatalogAtStart() throws SQLException { + return false; + } + + @Override + public String getCatalogSeparator() throws SQLException { + return null; + } + + @Override + public boolean supportsSchemasInDataManipulation() throws SQLException { + return false; + } + + @Override + public boolean supportsSchemasInProcedureCalls() throws SQLException { + return false; + } + + @Override + public boolean supportsSchemasInTableDefinitions() throws SQLException { + return false; + } + + @Override + public boolean supportsSchemasInIndexDefinitions() throws SQLException { + return false; + } + + @Override + public boolean supportsSchemasInPrivilegeDefinitions() throws SQLException { + return false; + } + + @Override + public boolean supportsCatalogsInDataManipulation() throws SQLException { + return false; + } + + @Override + public boolean supportsCatalogsInProcedureCalls() throws SQLException { + return false; + } + + @Override + public boolean supportsCatalogsInTableDefinitions() throws SQLException { + return false; + } + + @Override + public boolean supportsCatalogsInIndexDefinitions() throws SQLException { + return false; + } + + @Override + public boolean supportsCatalogsInPrivilegeDefinitions() throws SQLException { + return false; + } + + @Override + public boolean supportsPositionedDelete() throws SQLException { + return false; + } + + @Override + public boolean supportsPositionedUpdate() throws SQLException { + return false; + } + + @Override + public boolean supportsSelectForUpdate() throws SQLException { + return false; + } + + @Override + public boolean supportsStoredProcedures() throws SQLException { + return false; + } + + @Override + public boolean supportsSubqueriesInComparisons() throws SQLException { + return false; + } + + @Override + public boolean supportsSubqueriesInExists() throws SQLException { + return false; + } + + @Override + public boolean supportsSubqueriesInIns() throws SQLException { + return false; + } + + @Override + public boolean supportsSubqueriesInQuantifieds() throws SQLException { + return false; + } + + @Override + public boolean supportsCorrelatedSubqueries() throws SQLException { + return false; + } + + @Override + public boolean supportsUnion() throws SQLException { + return false; + } + + @Override + public boolean supportsUnionAll() throws SQLException { + return false; + } + + @Override + public boolean supportsOpenCursorsAcrossCommit() throws SQLException { + return false; + } + + @Override + public boolean supportsOpenCursorsAcrossRollback() throws SQLException { + return false; + } + + @Override + public boolean supportsOpenStatementsAcrossCommit() throws SQLException { + return false; + } + + @Override + public boolean supportsOpenStatementsAcrossRollback() throws SQLException { + return false; + } + + @Override + public int getMaxBinaryLiteralLength() throws SQLException { + return 0; + } + + @Override + public int getMaxCharLiteralLength() throws SQLException { + return 0; + } + + @Override + public int getMaxColumnNameLength() throws SQLException { + return 0; + } + + @Override + public int getMaxColumnsInGroupBy() throws SQLException { + return 0; + } + + @Override + public int getMaxColumnsInIndex() throws SQLException { + return 0; + } + + @Override + public int getMaxColumnsInOrderBy() throws SQLException { + return 0; + } + + @Override + public int getMaxColumnsInSelect() throws SQLException { + return 0; + } + + @Override + public int getMaxColumnsInTable() throws SQLException { + return 0; + } + + @Override + public int getMaxConnections() throws SQLException { + return 0; + } + + @Override + public int getMaxCursorNameLength() throws SQLException { + return 0; + } + + @Override + public int getMaxIndexLength() throws SQLException { + return 0; + } + + @Override + public int getMaxSchemaNameLength() throws SQLException { + return 0; + } + + @Override + public int getMaxProcedureNameLength() throws SQLException { + return 0; + } + + @Override + public int getMaxCatalogNameLength() throws SQLException { + return 0; + } + + @Override + public int getMaxRowSize() throws SQLException { + return 0; + } + + @Override + public boolean doesMaxRowSizeIncludeBlobs() throws SQLException { + return false; + } + + @Override + public int getMaxStatementLength() throws SQLException { + return 0; + } + + @Override + public int getMaxStatements() throws SQLException { + return 0; + } + + @Override + public int getMaxTableNameLength() throws SQLException { + return 0; + } + + @Override + public int getMaxTablesInSelect() throws SQLException { + return 0; + } + + @Override + public int getMaxUserNameLength() throws SQLException { + return 0; + } + + @Override + public int getDefaultTransactionIsolation() throws SQLException { + return 0; + } + + @Override + public boolean supportsTransactions() throws SQLException { + return false; + } + + @Override + public boolean supportsTransactionIsolationLevel(int level) throws SQLException { + return false; + } + + @Override + public boolean supportsDataDefinitionAndDataManipulationTransactions() throws SQLException { + return false; + } + + @Override + public boolean supportsDataManipulationTransactionsOnly() throws SQLException { + return false; + } + + @Override + public boolean dataDefinitionCausesTransactionCommit() throws SQLException { + return false; + } + + @Override + public boolean dataDefinitionIgnoredInTransactions() throws SQLException { + return false; + } + + @Override + public ResultSet getProcedures(String catalog, String schemaPattern, String procedureNamePattern) + throws SQLException { + return null; + } + + @Override + public ResultSet getProcedureColumns(String catalog, String schemaPattern, String procedureNamePattern, + String columnNamePattern) throws SQLException { + return null; + } + + @Override + public ResultSet getTables(String catalog, String schemaPattern, String tableNamePattern, String[] types) + throws SQLException { + return null; + } + + @Override + public ResultSet getSchemas() throws SQLException { + return null; + } + + @Override + public ResultSet getCatalogs() throws SQLException { + return null; + } + + @Override + public ResultSet getTableTypes() throws SQLException { + return null; + } + + @Override + public ResultSet getColumns(String catalog, String schemaPattern, String tableNamePattern, + String columnNamePattern) throws SQLException { + return null; + } + + @Override + public ResultSet getColumnPrivileges(String catalog, String schema, String table, String columnNamePattern) + throws SQLException { + return null; + } + + @Override + public ResultSet getTablePrivileges(String catalog, String schemaPattern, String tableNamePattern) + throws SQLException { + return null; + } + + @Override + public ResultSet getBestRowIdentifier(String catalog, String schema, String table, int scope, boolean nullable) + throws SQLException { + return null; + } + + @Override + public ResultSet getVersionColumns(String catalog, String schema, String table) throws SQLException { + return null; + } + + @Override + public ResultSet getPrimaryKeys(String catalog, String schema, String table) throws SQLException { + return null; + } + + @Override + public ResultSet getImportedKeys(String catalog, String schema, String table) throws SQLException { + return null; + } + + @Override + public ResultSet getExportedKeys(String catalog, String schema, String table) throws SQLException { + return null; + } + + @Override + public ResultSet getCrossReference(String parentCatalog, String parentSchema, String parentTable, + String foreignCatalog, String foreignSchema, String foreignTable) + throws SQLException { + return null; + } + + @Override + public ResultSet getTypeInfo() throws SQLException { + return null; + } + + @Override + public ResultSet getIndexInfo(String catalog, String schema, String table, boolean unique, boolean approximate) + throws SQLException { + return null; + } + + @Override + public boolean supportsResultSetType(int type) throws SQLException { + return false; + } + + @Override + public boolean supportsResultSetConcurrency(int type, int concurrency) throws SQLException { + return false; + } + + @Override + public boolean ownUpdatesAreVisible(int type) throws SQLException { + return false; + } + + @Override + public boolean ownDeletesAreVisible(int type) throws SQLException { + return false; + } + + @Override + public boolean ownInsertsAreVisible(int type) throws SQLException { + return false; + } + + @Override + public boolean othersUpdatesAreVisible(int type) throws SQLException { + return false; + } + + @Override + public boolean othersDeletesAreVisible(int type) throws SQLException { + return false; + } + + @Override + public boolean othersInsertsAreVisible(int type) throws SQLException { + return false; + } + + @Override + public boolean updatesAreDetected(int type) throws SQLException { + return false; + } + + @Override + public boolean deletesAreDetected(int type) throws SQLException { + return false; + } + + @Override + public boolean insertsAreDetected(int type) throws SQLException { + return false; + } + + @Override + public boolean supportsBatchUpdates() throws SQLException { + return false; + } + + @Override + public ResultSet getUDTs(String catalog, String schemaPattern, String typeNamePattern, int[] types) + throws SQLException { + return null; + } + + @Override + public Connection getConnection() throws SQLException { + return null; + } + + @Override + public boolean supportsSavepoints() throws SQLException { + return false; + } + + @Override + public boolean supportsNamedParameters() throws SQLException { + return false; + } + + @Override + public boolean supportsMultipleOpenResults() throws SQLException { + return false; + } + + @Override + public boolean supportsGetGeneratedKeys() throws SQLException { + return false; + } + + @Override + public ResultSet getSuperTypes(String catalog, String schemaPattern, String typeNamePattern) throws SQLException { + return null; + } + + @Override + public ResultSet getSuperTables(String catalog, String schemaPattern, String tableNamePattern) throws SQLException { + return null; + } + + @Override + public ResultSet getAttributes(String catalog, String schemaPattern, String typeNamePattern, + String attributeNamePattern) throws SQLException { + return null; + } + + @Override + public boolean supportsResultSetHoldability(int holdability) throws SQLException { + return false; + } + + @Override + public int getResultSetHoldability() throws SQLException { + return 0; + } + + @Override + public int getDatabaseMajorVersion() throws SQLException { + return 0; + } + + @Override + public int getDatabaseMinorVersion() throws SQLException { + return 0; + } + + @Override + public int getJDBCMajorVersion() throws SQLException { + return 0; + } + + @Override + public int getJDBCMinorVersion() throws SQLException { + return 0; + } + + @Override + public int getSQLStateType() throws SQLException { + return 0; + } + + @Override + public boolean locatorsUpdateCopy() throws SQLException { + return false; + } + + @Override + public boolean supportsStatementPooling() throws SQLException { + return false; + } + + @Override + public RowIdLifetime getRowIdLifetime() throws SQLException { + return null; + } + + @Override + public ResultSet getSchemas(String catalog, String schemaPattern) throws SQLException { + return null; + } + + @Override + public boolean supportsStoredFunctionsUsingCallSyntax() throws SQLException { + return false; + } + + @Override + public boolean autoCommitFailureClosesAllResultSets() throws SQLException { + return false; + } + + @Override + public ResultSet getClientInfoProperties() throws SQLException { + return null; + } + + @Override + public ResultSet getFunctions(String catalog, String schemaPattern, String functionNamePattern) throws SQLException { + return null; + } + + @Override + public ResultSet getFunctionColumns(String catalog, String schemaPattern, String functionNamePattern, + String columnNamePattern) throws SQLException { + return null; + } + + @Override + public ResultSet getPseudoColumns(String catalog, String schemaPattern, String tableNamePattern, + String columnNamePattern) throws SQLException { + return null; + } + + @Override + public boolean generatedKeyAlwaysReturned() throws SQLException { + return false; + } + + @Override + public T unwrap(Class iface) throws SQLException { + return null; + } + + @Override + public boolean isWrapperFor(Class iface) throws SQLException { + return false; + } +} diff --git a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/mock/MockJDBCDriver.java b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/mock/MockJDBCDriver.java new file mode 100644 index 0000000000..24944a3b39 --- /dev/null +++ b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/mock/MockJDBCDriver.java @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2018 - 2023, 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.device.mgt.extensions.device.organization.mock; + +import java.sql.Connection; +import java.sql.Driver; +import java.sql.DriverPropertyInfo; +import java.sql.SQLException; +import java.sql.SQLFeatureNotSupportedException; +import java.util.Properties; +import java.util.logging.Logger; + +/** + * This is the mock JDBC driver which is used in the testcases to mock other database operations. + */ +public class MockJDBCDriver implements Driver { + + @Override + public Connection connect(String url, Properties info) throws SQLException { + return new MockConnection(url); + } + + @Override + public boolean acceptsURL(String url) throws SQLException { + return true; + } + + @Override + public DriverPropertyInfo[] getPropertyInfo(String url, Properties info) throws SQLException { + return new DriverPropertyInfo[0]; + } + + @Override + public int getMajorVersion() { + return 0; + } + + @Override + public int getMinorVersion() { + return 0; + } + + @Override + public boolean jdbcCompliant() { + return true; + } + + @Override + public Logger getParentLogger() throws SQLFeatureNotSupportedException { + return null; + } + + +} diff --git a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/mock/MockResultSet.java b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/mock/MockResultSet.java new file mode 100644 index 0000000000..08b4beb4f7 --- /dev/null +++ b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/mock/MockResultSet.java @@ -0,0 +1,1113 @@ +/* + * Copyright (c) 2018 - 2023, 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.device.mgt.extensions.device.organization.mock; + +import java.io.InputStream; +import java.io.Reader; +import java.math.BigDecimal; +import java.net.URL; +import java.sql.Array; +import java.sql.Blob; +import java.sql.Clob; +import java.sql.Date; +import java.sql.NClob; +import java.sql.Ref; +import java.sql.ResultSet; +import java.sql.ResultSetMetaData; +import java.sql.RowId; +import java.sql.SQLException; +import java.sql.SQLWarning; +import java.sql.SQLXML; +import java.sql.Statement; +import java.sql.Time; +import java.sql.Timestamp; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; +import java.util.Map; +import java.util.concurrent.atomic.AtomicInteger; + +public class MockResultSet implements ResultSet { + private final List stringList = new ArrayList<>(); + private final List integerList = new ArrayList<>(); + private final List doubleList = new ArrayList<>(); + private final List booleanList = new ArrayList<>(); + private final List timestamps = new ArrayList<>(); + + private final AtomicInteger stringCounter = new AtomicInteger(0); + private final AtomicInteger integerCounter = new AtomicInteger(0); + private final AtomicInteger doubleCounter = new AtomicInteger(0); + private final AtomicInteger booleanCounter = new AtomicInteger(0); + private final AtomicInteger timestampCounter = new AtomicInteger(0); + + private boolean iterated = false; + private boolean hasData = false; + + @Override + public boolean next() throws SQLException { + if (!this.iterated && this.hasData) { + this.iterated = true; + return true; + } else { + return false; + } + } + + @Override + public void close() throws SQLException { + + } + + @Override + public boolean wasNull() throws SQLException { + return false; + } + + @Override + public String getString(int columnIndex) throws SQLException { + Object item = getItem(this.stringList, this.stringCounter); + if (item != null) { + return (String) item; + } else { + return ""; + } + } + + private Object getItem(List list, AtomicInteger counter) { + if (!list.isEmpty()) { + return list.get(counter.getAndIncrement()); + } + return null; + } + + @Override + public boolean getBoolean(int columnIndex) throws SQLException { + Object item = getItem(this.booleanList, this.booleanCounter); + if (item != null) { + return (Boolean) item; + } else { + return false; + } + } + + @Override + public byte getByte(int columnIndex) throws SQLException { + return 0; + } + + @Override + public short getShort(int columnIndex) throws SQLException { + return 0; + } + + @Override + public int getInt(int columnIndex) throws SQLException { + Object item = getItem(this.integerList, this.integerCounter); + if (item != null) { + return (Integer) item; + } else { + return 0; + } + } + + @Override + public long getLong(int columnIndex) throws SQLException { + return 0; + } + + @Override + public float getFloat(int columnIndex) throws SQLException { + return 0; + } + + @Override + public double getDouble(int columnIndex) throws SQLException { + Object item = getItem(this.doubleList, this.doubleCounter); + if (item != null) { + return (Double) item; + } else { + return 0.0; + } + } + + @Override + public BigDecimal getBigDecimal(int columnIndex, int scale) throws SQLException { + return null; + } + + @Override + public byte[] getBytes(int columnIndex) throws SQLException { + return new byte[0]; + } + + @Override + public Date getDate(int columnIndex) throws SQLException { + return null; + } + + @Override + public Time getTime(int columnIndex) throws SQLException { + return null; + } + + @Override + public Timestamp getTimestamp(int columnIndex) throws SQLException { + Object item = getItem(this.timestamps, this.timestampCounter); + if (item != null) { + return (Timestamp) item; + } else { + return new Timestamp(System.currentTimeMillis()); + } + } + + @Override + public InputStream getAsciiStream(int columnIndex) throws SQLException { + return null; + } + + @Override + public InputStream getUnicodeStream(int columnIndex) throws SQLException { + return null; + } + + @Override + public InputStream getBinaryStream(int columnIndex) throws SQLException { + return null; + } + + @Override + public String getString(String columnLabel) throws SQLException { + Object item = getItem(this.stringList, this.stringCounter); + if (item != null) { + return (String) item; + } else { + return ""; + } + } + + @Override + public boolean getBoolean(String columnLabel) throws SQLException { + Object item = getItem(this.booleanList, this.booleanCounter); + if (item != null) { + return (Boolean) item; + } else { + return false; + } + } + + @Override + public byte getByte(String columnLabel) throws SQLException { + return 0; + } + + @Override + public short getShort(String columnLabel) throws SQLException { + return 0; + } + + @Override + public int getInt(String columnLabel) throws SQLException { + Object item = getItem(this.integerList, this.integerCounter); + if (item != null) { + return (Integer) item; + } else { + return 0; + } + } + + @Override + public long getLong(String columnLabel) throws SQLException { + return 0; + } + + @Override + public float getFloat(String columnLabel) throws SQLException { + return 0; + } + + @Override + public double getDouble(String columnLabel) throws SQLException { + Object item = getItem(this.doubleList, this.doubleCounter); + if (item != null) { + return (Double) item; + } else { + return 0.0; + } + } + + @Override + public BigDecimal getBigDecimal(String columnLabel, int scale) throws SQLException { + return null; + } + + @Override + public byte[] getBytes(String columnLabel) throws SQLException { + return new byte[0]; + } + + @Override + public Date getDate(String columnLabel) throws SQLException { + return null; + } + + @Override + public Time getTime(String columnLabel) throws SQLException { + return null; + } + + @Override + public Timestamp getTimestamp(String columnLabel) throws SQLException { + Object item = getItem(this.timestamps, this.timestampCounter); + if (item != null) { + return (Timestamp) item; + } else { + return new Timestamp(System.currentTimeMillis()); + } + } + + @Override + public InputStream getAsciiStream(String columnLabel) throws SQLException { + return null; + } + + @Override + public InputStream getUnicodeStream(String columnLabel) throws SQLException { + return null; + } + + @Override + public InputStream getBinaryStream(String columnLabel) throws SQLException { + return null; + } + + @Override + public SQLWarning getWarnings() throws SQLException { + return null; + } + + @Override + public void clearWarnings() throws SQLException { + + } + + @Override + public String getCursorName() throws SQLException { + return null; + } + + @Override + public ResultSetMetaData getMetaData() throws SQLException { + return null; + } + + @Override + public Object getObject(int columnIndex) throws SQLException { + return null; + } + + @Override + public Object getObject(String columnLabel) throws SQLException { + return null; + } + + @Override + public int findColumn(String columnLabel) throws SQLException { + return 0; + } + + @Override + public Reader getCharacterStream(int columnIndex) throws SQLException { + return null; + } + + @Override + public Reader getCharacterStream(String columnLabel) throws SQLException { + return null; + } + + @Override + public BigDecimal getBigDecimal(int columnIndex) throws SQLException { + return null; + } + + @Override + public BigDecimal getBigDecimal(String columnLabel) throws SQLException { + return null; + } + + @Override + public boolean isBeforeFirst() throws SQLException { + return false; + } + + @Override + public boolean isAfterLast() throws SQLException { + return false; + } + + @Override + public boolean isFirst() throws SQLException { + return false; + } + + @Override + public boolean isLast() throws SQLException { + return false; + } + + @Override + public void beforeFirst() throws SQLException { + + } + + @Override + public void afterLast() throws SQLException { + + } + + @Override + public boolean first() throws SQLException { + return false; + } + + @Override + public boolean last() throws SQLException { + return false; + } + + @Override + public int getRow() throws SQLException { + return 0; + } + + @Override + public boolean absolute(int row) throws SQLException { + return false; + } + + @Override + public boolean relative(int rows) throws SQLException { + return false; + } + + @Override + public boolean previous() throws SQLException { + return false; + } + + @Override + public int getFetchDirection() throws SQLException { + return 0; + } + + @Override + public void setFetchDirection(int direction) throws SQLException { + + } + + @Override + public int getFetchSize() throws SQLException { + return 0; + } + + @Override + public void setFetchSize(int rows) throws SQLException { + + } + + @Override + public int getType() throws SQLException { + return 0; + } + + @Override + public int getConcurrency() throws SQLException { + return 0; + } + + @Override + public boolean rowUpdated() throws SQLException { + return false; + } + + @Override + public boolean rowInserted() throws SQLException { + return false; + } + + @Override + public boolean rowDeleted() throws SQLException { + return false; + } + + @Override + public void updateNull(int columnIndex) throws SQLException { + + } + + @Override + public void updateBoolean(int columnIndex, boolean x) throws SQLException { + + } + + @Override + public void updateByte(int columnIndex, byte x) throws SQLException { + + } + + @Override + public void updateShort(int columnIndex, short x) throws SQLException { + + } + + @Override + public void updateInt(int columnIndex, int x) throws SQLException { + + } + + @Override + public void updateLong(int columnIndex, long x) throws SQLException { + + } + + @Override + public void updateFloat(int columnIndex, float x) throws SQLException { + + } + + @Override + public void updateDouble(int columnIndex, double x) throws SQLException { + + } + + @Override + public void updateBigDecimal(int columnIndex, BigDecimal x) throws SQLException { + + } + + @Override + public void updateString(int columnIndex, String x) throws SQLException { + + } + + @Override + public void updateBytes(int columnIndex, byte[] x) throws SQLException { + + } + + @Override + public void updateDate(int columnIndex, Date x) throws SQLException { + + } + + @Override + public void updateTime(int columnIndex, Time x) throws SQLException { + + } + + @Override + public void updateTimestamp(int columnIndex, Timestamp x) throws SQLException { + + } + + @Override + public void updateAsciiStream(int columnIndex, InputStream x, int length) throws SQLException { + + } + + @Override + public void updateBinaryStream(int columnIndex, InputStream x, int length) throws SQLException { + + } + + @Override + public void updateCharacterStream(int columnIndex, Reader x, int length) throws SQLException { + + } + + @Override + public void updateObject(int columnIndex, Object x, int scaleOrLength) throws SQLException { + + } + + @Override + public void updateObject(int columnIndex, Object x) throws SQLException { + + } + + @Override + public void updateNull(String columnLabel) throws SQLException { + + } + + @Override + public void updateBoolean(String columnLabel, boolean x) throws SQLException { + + } + + @Override + public void updateByte(String columnLabel, byte x) throws SQLException { + + } + + @Override + public void updateShort(String columnLabel, short x) throws SQLException { + + } + + @Override + public void updateInt(String columnLabel, int x) throws SQLException { + + } + + @Override + public void updateLong(String columnLabel, long x) throws SQLException { + + } + + @Override + public void updateFloat(String columnLabel, float x) throws SQLException { + + } + + @Override + public void updateDouble(String columnLabel, double x) throws SQLException { + + } + + @Override + public void updateBigDecimal(String columnLabel, BigDecimal x) throws SQLException { + + } + + @Override + public void updateString(String columnLabel, String x) throws SQLException { + + } + + @Override + public void updateBytes(String columnLabel, byte[] x) throws SQLException { + + } + + @Override + public void updateDate(String columnLabel, Date x) throws SQLException { + + } + + @Override + public void updateTime(String columnLabel, Time x) throws SQLException { + + } + + @Override + public void updateTimestamp(String columnLabel, Timestamp x) throws SQLException { + + } + + @Override + public void updateAsciiStream(String columnLabel, InputStream x, int length) throws SQLException { + + } + + @Override + public void updateBinaryStream(String columnLabel, InputStream x, int length) throws SQLException { + + } + + @Override + public void updateCharacterStream(String columnLabel, Reader reader, int length) throws SQLException { + + } + + @Override + public void updateObject(String columnLabel, Object x, int scaleOrLength) throws SQLException { + + } + + @Override + public void updateObject(String columnLabel, Object x) throws SQLException { + + } + + @Override + public void insertRow() throws SQLException { + + } + + @Override + public void updateRow() throws SQLException { + + } + + @Override + public void deleteRow() throws SQLException { + + } + + @Override + public void refreshRow() throws SQLException { + + } + + @Override + public void cancelRowUpdates() throws SQLException { + + } + + @Override + public void moveToInsertRow() throws SQLException { + + } + + @Override + public void moveToCurrentRow() throws SQLException { + + } + + @Override + public Statement getStatement() throws SQLException { + return null; + } + + @Override + public Object getObject(int columnIndex, Map> map) throws SQLException { + return null; + } + + @Override + public Ref getRef(int columnIndex) throws SQLException { + return null; + } + + @Override + public Blob getBlob(int columnIndex) throws SQLException { + return null; + } + + @Override + public Clob getClob(int columnIndex) throws SQLException { + return null; + } + + @Override + public Array getArray(int columnIndex) throws SQLException { + return null; + } + + @Override + public Object getObject(String columnLabel, Map> map) throws SQLException { + return null; + } + + @Override + public Ref getRef(String columnLabel) throws SQLException { + return null; + } + + @Override + public Blob getBlob(String columnLabel) throws SQLException { + return null; + } + + @Override + public Clob getClob(String columnLabel) throws SQLException { + return null; + } + + @Override + public Array getArray(String columnLabel) throws SQLException { + return null; + } + + @Override + public Date getDate(int columnIndex, Calendar cal) throws SQLException { + return null; + } + + @Override + public Date getDate(String columnLabel, Calendar cal) throws SQLException { + return null; + } + + @Override + public Time getTime(int columnIndex, Calendar cal) throws SQLException { + return null; + } + + @Override + public Time getTime(String columnLabel, Calendar cal) throws SQLException { + return null; + } + + @Override + public Timestamp getTimestamp(int columnIndex, Calendar cal) throws SQLException { + Object item = getItem(this.timestamps, this.timestampCounter); + if (item != null) { + return (Timestamp) item; + } else { + return new Timestamp(System.currentTimeMillis()); + } + } + + @Override + public Timestamp getTimestamp(String columnLabel, Calendar cal) throws SQLException { + Object item = getItem(this.timestamps, this.timestampCounter); + if (item != null) { + return (Timestamp) item; + } else { + return new Timestamp(System.currentTimeMillis()); + } + } + + @Override + public URL getURL(int columnIndex) throws SQLException { + return null; + } + + @Override + public URL getURL(String columnLabel) throws SQLException { + return null; + } + + @Override + public void updateRef(int columnIndex, Ref x) throws SQLException { + + } + + @Override + public void updateRef(String columnLabel, Ref x) throws SQLException { + + } + + @Override + public void updateBlob(int columnIndex, Blob x) throws SQLException { + + } + + @Override + public void updateBlob(String columnLabel, Blob x) throws SQLException { + + } + + @Override + public void updateClob(int columnIndex, Clob x) throws SQLException { + + } + + @Override + public void updateClob(String columnLabel, Clob x) throws SQLException { + + } + + @Override + public void updateArray(int columnIndex, Array x) throws SQLException { + + } + + @Override + public void updateArray(String columnLabel, Array x) throws SQLException { + + } + + @Override + public RowId getRowId(int columnIndex) throws SQLException { + return null; + } + + @Override + public RowId getRowId(String columnLabel) throws SQLException { + return null; + } + + @Override + public void updateRowId(int columnIndex, RowId x) throws SQLException { + + } + + @Override + public void updateRowId(String columnLabel, RowId x) throws SQLException { + + } + + @Override + public int getHoldability() throws SQLException { + return 0; + } + + @Override + public boolean isClosed() throws SQLException { + return false; + } + + @Override + public void updateNString(int columnIndex, String nString) throws SQLException { + + } + + @Override + public void updateNString(String columnLabel, String nString) throws SQLException { + + } + + @Override + public void updateNClob(int columnIndex, NClob nClob) throws SQLException { + + } + + @Override + public void updateNClob(String columnLabel, NClob nClob) throws SQLException { + + } + + @Override + public NClob getNClob(int columnIndex) throws SQLException { + return null; + } + + @Override + public NClob getNClob(String columnLabel) throws SQLException { + return null; + } + + @Override + public SQLXML getSQLXML(int columnIndex) throws SQLException { + return null; + } + + @Override + public SQLXML getSQLXML(String columnLabel) throws SQLException { + return null; + } + + @Override + public void updateSQLXML(int columnIndex, SQLXML xmlObject) throws SQLException { + + } + + @Override + public void updateSQLXML(String columnLabel, SQLXML xmlObject) throws SQLException { + + } + + @Override + public String getNString(int columnIndex) throws SQLException { + return null; + } + + @Override + public String getNString(String columnLabel) throws SQLException { + return null; + } + + @Override + public Reader getNCharacterStream(int columnIndex) throws SQLException { + return null; + } + + @Override + public Reader getNCharacterStream(String columnLabel) throws SQLException { + return null; + } + + @Override + public void updateNCharacterStream(int columnIndex, Reader x, long length) throws SQLException { + + } + + @Override + public void updateNCharacterStream(String columnLabel, Reader reader, long length) throws SQLException { + + } + + @Override + public void updateAsciiStream(int columnIndex, InputStream x, long length) throws SQLException { + + } + + @Override + public void updateBinaryStream(int columnIndex, InputStream x, long length) throws SQLException { + + } + + @Override + public void updateCharacterStream(int columnIndex, Reader x, long length) throws SQLException { + + } + + @Override + public void updateAsciiStream(String columnLabel, InputStream x, long length) throws SQLException { + + } + + @Override + public void updateBinaryStream(String columnLabel, InputStream x, long length) throws SQLException { + + } + + @Override + public void updateCharacterStream(String columnLabel, Reader reader, long length) throws SQLException { + + } + + @Override + public void updateBlob(int columnIndex, InputStream inputStream, long length) throws SQLException { + + } + + @Override + public void updateBlob(String columnLabel, InputStream inputStream, long length) throws SQLException { + + } + + @Override + public void updateClob(int columnIndex, Reader reader, long length) throws SQLException { + + } + + @Override + public void updateClob(String columnLabel, Reader reader, long length) throws SQLException { + + } + + @Override + public void updateNClob(int columnIndex, Reader reader, long length) throws SQLException { + + } + + @Override + public void updateNClob(String columnLabel, Reader reader, long length) throws SQLException { + + } + + @Override + public void updateNCharacterStream(int columnIndex, Reader x) throws SQLException { + + } + + @Override + public void updateNCharacterStream(String columnLabel, Reader reader) throws SQLException { + + } + + @Override + public void updateAsciiStream(int columnIndex, InputStream x) throws SQLException { + + } + + @Override + public void updateBinaryStream(int columnIndex, InputStream x) throws SQLException { + + } + + @Override + public void updateCharacterStream(int columnIndex, Reader x) throws SQLException { + + } + + @Override + public void updateAsciiStream(String columnLabel, InputStream x) throws SQLException { + + } + + @Override + public void updateBinaryStream(String columnLabel, InputStream x) throws SQLException { + + } + + @Override + public void updateCharacterStream(String columnLabel, Reader reader) throws SQLException { + + } + + @Override + public void updateBlob(int columnIndex, InputStream inputStream) throws SQLException { + + } + + @Override + public void updateBlob(String columnLabel, InputStream inputStream) throws SQLException { + + } + + @Override + public void updateClob(int columnIndex, Reader reader) throws SQLException { + + } + + @Override + public void updateClob(String columnLabel, Reader reader) throws SQLException { + + } + + @Override + public void updateNClob(int columnIndex, Reader reader) throws SQLException { + + } + + @Override + public void updateNClob(String columnLabel, Reader reader) throws SQLException { + + } + + @Override + public T getObject(int columnIndex, Class type) throws SQLException { + return null; + } + + @Override + public T getObject(String columnLabel, Class type) throws SQLException { + return null; + } + + @Override + public T unwrap(Class iface) throws SQLException { + return null; + } + + @Override + public boolean isWrapperFor(Class iface) throws SQLException { + return false; + } + + public void addString(String string) { + this.stringList.add(string); + this.hasData = true; + } + + public void addInteger(Integer integer) { + this.integerList.add(integer); + this.hasData = true; + } + + public void addBoolean(Boolean bool) { + this.booleanList.add(bool); + this.hasData = true; + } + + public void addDouble(Double doubleVal) { + this.doubleList.add(doubleVal); + this.hasData = true; + } + + public void addTimestamp(Timestamp timestamp) { + this.timestamps.add(timestamp); + this.hasData = true; + } +} diff --git a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/mock/MockStatement.java b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/mock/MockStatement.java new file mode 100644 index 0000000000..50d199b424 --- /dev/null +++ b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/mock/MockStatement.java @@ -0,0 +1,561 @@ +/* + * Copyright (c) 2018 - 2023, 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.device.mgt.extensions.device.organization.mock; + +import java.io.InputStream; +import java.io.Reader; +import java.math.BigDecimal; +import java.net.URL; +import java.sql.Array; +import java.sql.Blob; +import java.sql.Clob; +import java.sql.Connection; +import java.sql.Date; +import java.sql.NClob; +import java.sql.ParameterMetaData; +import java.sql.PreparedStatement; +import java.sql.Ref; +import java.sql.ResultSet; +import java.sql.ResultSetMetaData; +import java.sql.RowId; +import java.sql.SQLException; +import java.sql.SQLWarning; +import java.sql.SQLXML; +import java.sql.Time; +import java.sql.Timestamp; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; + +/** + * This is the mock statement for the test cases. + */ +public class MockStatement implements PreparedStatement { + private final List resultSets = new ArrayList<>(); + private int resultSetCounter; + + @Override + public ResultSet executeQuery(String sql) throws SQLException { + return this.getMockResultSet(); + } + + private ResultSet getMockResultSet() { + if (!this.resultSets.isEmpty()) { + ResultSet resultSet = this.resultSets.get(this.resultSetCounter); + this.resultSetCounter++; + return resultSet; + } else { + return new MockResultSet(); + } + } + + @Override + public int executeUpdate(String sql) throws SQLException { + return 0; + } + + @Override + public void close() throws SQLException { + + } + + @Override + public int getMaxFieldSize() throws SQLException { + return 0; + } + + @Override + public void setMaxFieldSize(int max) throws SQLException { + + } + + @Override + public int getMaxRows() throws SQLException { + return 0; + } + + @Override + public void setMaxRows(int max) throws SQLException { + + } + + @Override + public void setEscapeProcessing(boolean enable) throws SQLException { + + } + + @Override + public int getQueryTimeout() throws SQLException { + return 0; + } + + @Override + public void setQueryTimeout(int seconds) throws SQLException { + + } + + @Override + public void cancel() throws SQLException { + + } + + @Override + public SQLWarning getWarnings() throws SQLException { + return null; + } + + @Override + public void clearWarnings() throws SQLException { + + } + + @Override + public void setCursorName(String name) throws SQLException { + + } + + @Override + public boolean execute(String sql) throws SQLException { + return false; + } + + @Override + public ResultSet getResultSet() throws SQLException { + return getMockResultSet(); + } + + @Override + public int getUpdateCount() throws SQLException { + return 0; + } + + @Override + public boolean getMoreResults() throws SQLException { + return false; + } + + @Override + public int getFetchDirection() throws SQLException { + return 0; + } + + @Override + public void setFetchDirection(int direction) throws SQLException { + + } + + @Override + public int getFetchSize() throws SQLException { + return 0; + } + + @Override + public void setFetchSize(int rows) throws SQLException { + + } + + @Override + public int getResultSetConcurrency() throws SQLException { + return 0; + } + + @Override + public int getResultSetType() throws SQLException { + return 0; + } + + @Override + public void addBatch(String sql) throws SQLException { + + } + + @Override + public void clearBatch() throws SQLException { + + } + + @Override + public int[] executeBatch() throws SQLException { + return new int[0]; + } + + @Override + public Connection getConnection() throws SQLException { + return null; + } + + @Override + public boolean getMoreResults(int current) throws SQLException { + return false; + } + + @Override + public ResultSet getGeneratedKeys() throws SQLException { + return getMockResultSet(); + } + + @Override + public int executeUpdate(String sql, int autoGeneratedKeys) throws SQLException { + return 0; + } + + @Override + public int executeUpdate(String sql, int[] columnIndexes) throws SQLException { + return 0; + } + + @Override + public int executeUpdate(String sql, String[] columnNames) throws SQLException { + return 0; + } + + @Override + public boolean execute(String sql, int autoGeneratedKeys) throws SQLException { + return false; + } + + @Override + public boolean execute(String sql, int[] columnIndexes) throws SQLException { + return false; + } + + @Override + public boolean execute(String sql, String[] columnNames) throws SQLException { + return false; + } + + @Override + public int getResultSetHoldability() throws SQLException { + return 0; + } + + @Override + public boolean isClosed() throws SQLException { + return false; + } + + @Override + public boolean isPoolable() throws SQLException { + return false; + } + + @Override + public void setPoolable(boolean poolable) throws SQLException { + + } + + @Override + public void closeOnCompletion() throws SQLException { + + } + + @Override + public boolean isCloseOnCompletion() throws SQLException { + return false; + } + + @Override + public T unwrap(Class iface) throws SQLException { + return null; + } + + @Override + public boolean isWrapperFor(Class iface) throws SQLException { + return false; + } + + @Override + public ResultSet executeQuery() throws SQLException { + return getMockResultSet(); + } + + @Override + public int executeUpdate() throws SQLException { + return 0; + } + + @Override + public void setNull(int parameterIndex, int sqlType) throws SQLException { + + } + + @Override + public void setBoolean(int parameterIndex, boolean x) throws SQLException { + + } + + @Override + public void setByte(int parameterIndex, byte x) throws SQLException { + + } + + @Override + public void setShort(int parameterIndex, short x) throws SQLException { + + } + + @Override + public void setInt(int parameterIndex, int x) throws SQLException { + + } + + @Override + public void setLong(int parameterIndex, long x) throws SQLException { + + } + + @Override + public void setFloat(int parameterIndex, float x) throws SQLException { + + } + + @Override + public void setDouble(int parameterIndex, double x) throws SQLException { + + } + + @Override + public void setBigDecimal(int parameterIndex, BigDecimal x) throws SQLException { + + } + + @Override + public void setString(int parameterIndex, String x) throws SQLException { + + } + + @Override + public void setBytes(int parameterIndex, byte[] x) throws SQLException { + + } + + @Override + public void setDate(int parameterIndex, Date x) throws SQLException { + + } + + @Override + public void setTime(int parameterIndex, Time x) throws SQLException { + + } + + @Override + public void setTimestamp(int parameterIndex, Timestamp x) throws SQLException { + + } + + @Override + public void setAsciiStream(int parameterIndex, InputStream x, int length) throws SQLException { + + } + + @Override + public void setUnicodeStream(int parameterIndex, InputStream x, int length) throws SQLException { + + } + + @Override + public void setBinaryStream(int parameterIndex, InputStream x, int length) throws SQLException { + + } + + @Override + public void clearParameters() throws SQLException { + + } + + @Override + public void setObject(int parameterIndex, Object x, int targetSqlType) throws SQLException { + + } + + @Override + public void setObject(int parameterIndex, Object x) throws SQLException { + + } + + @Override + public boolean execute() throws SQLException { + return false; + } + + @Override + public void addBatch() throws SQLException { + + } + + @Override + public void setCharacterStream(int parameterIndex, Reader reader, int length) throws SQLException { + + } + + @Override + public void setRef(int parameterIndex, Ref x) throws SQLException { + + } + + @Override + public void setBlob(int parameterIndex, Blob x) throws SQLException { + + } + + @Override + public void setClob(int parameterIndex, Clob x) throws SQLException { + + } + + @Override + public void setArray(int parameterIndex, Array x) throws SQLException { + + } + + @Override + public ResultSetMetaData getMetaData() throws SQLException { + return null; + } + + @Override + public void setDate(int parameterIndex, Date x, Calendar cal) throws SQLException { + + } + + @Override + public void setTime(int parameterIndex, Time x, Calendar cal) throws SQLException { + + } + + @Override + public void setTimestamp(int parameterIndex, Timestamp x, Calendar cal) throws SQLException { + + } + + @Override + public void setNull(int parameterIndex, int sqlType, String typeName) throws SQLException { + + } + + @Override + public void setURL(int parameterIndex, URL x) throws SQLException { + + } + + @Override + public ParameterMetaData getParameterMetaData() throws SQLException { + return null; + } + + @Override + public void setRowId(int parameterIndex, RowId x) throws SQLException { + + } + + @Override + public void setNString(int parameterIndex, String value) throws SQLException { + + } + + @Override + public void setNCharacterStream(int parameterIndex, Reader value, long length) throws SQLException { + + } + + @Override + public void setNClob(int parameterIndex, NClob value) throws SQLException { + + } + + @Override + public void setClob(int parameterIndex, Reader reader, long length) throws SQLException { + + } + + @Override + public void setBlob(int parameterIndex, InputStream inputStream, long length) throws SQLException { + + } + + @Override + public void setNClob(int parameterIndex, Reader reader, long length) throws SQLException { + + } + + @Override + public void setSQLXML(int parameterIndex, SQLXML xmlObject) throws SQLException { + + } + + @Override + public void setObject(int parameterIndex, Object x, int targetSqlType, int scaleOrLength) throws SQLException { + + } + + @Override + public void setAsciiStream(int parameterIndex, InputStream x, long length) throws SQLException { + + } + + @Override + public void setBinaryStream(int parameterIndex, InputStream x, long length) throws SQLException { + + } + + @Override + public void setCharacterStream(int parameterIndex, Reader reader, long length) throws SQLException { + + } + + @Override + public void setAsciiStream(int parameterIndex, InputStream x) throws SQLException { + + } + + @Override + public void setBinaryStream(int parameterIndex, InputStream x) throws SQLException { + + } + + @Override + public void setCharacterStream(int parameterIndex, Reader reader) throws SQLException { + + } + + @Override + public void setNCharacterStream(int parameterIndex, Reader value) throws SQLException { + + } + + @Override + public void setClob(int parameterIndex, Reader reader) throws SQLException { + + } + + @Override + public void setBlob(int parameterIndex, InputStream inputStream) throws SQLException { + + } + + @Override + public void setNClob(int parameterIndex, Reader reader) throws SQLException { + + } + + public void addResultSet(MockResultSet resultSet) { + this.resultSets.add(resultSet); + } +} diff --git a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/carbon-home/dbscripts/dm-db-h2.sql b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/carbon-home/dbscripts/dm-db-h2.sql new file mode 100644 index 0000000000..158615a137 --- /dev/null +++ b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/carbon-home/dbscripts/dm-db-h2.sql @@ -0,0 +1,890 @@ +/* + * Copyright (c) 2018 - 2023, 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. + */ + + CREATE TABLE IF NOT EXISTS DM_DEVICE_TYPE +( + ID INT AUTO_INCREMENT NOT NULL, + NAME VARCHAR(300) NULL DEFAULT NULL, + DEVICE_TYPE_META VARCHAR(20000) NULL DEFAULT NULL, + LAST_UPDATED_TIMESTAMP TIMESTAMP NOT NULL, + PROVIDER_TENANT_ID INTEGER DEFAULT 0, + SHARED_WITH_ALL_TENANTS BOOLEAN NOT NULL DEFAULT FALSE, + PRIMARY KEY (ID) +); + +CREATE TABLE IF NOT EXISTS DM_DEVICE_CERTIFICATE +( + ID INTEGER auto_increment NOT NULL, + SERIAL_NUMBER VARCHAR(500) DEFAULT NULL, + CERTIFICATE BLOB DEFAULT NULL, + TENANT_ID INTEGER DEFAULT 0, + USERNAME VARCHAR(500) DEFAULT NULL, + PRIMARY KEY (ID) +); + +CREATE TABLE IF NOT EXISTS DM_GROUP +( + ID INTEGER AUTO_INCREMENT NOT NULL, + GROUP_NAME VARCHAR(100) DEFAULT NULL, + STATUS VARCHAR(50) DEFAULT NULL, + DESCRIPTION TEXT DEFAULT NULL, + OWNER VARCHAR(255) DEFAULT NULL, + PARENT_PATH VARCHAR(255) DEFAULT '/', + TENANT_ID INTEGER DEFAULT 0, + PRIMARY KEY (ID) +); + +CREATE TABLE IF NOT EXISTS DM_ROLE_GROUP_MAP +( + ID INTEGER AUTO_INCREMENT NOT NULL, + GROUP_ID INTEGER DEFAULT NULL, + ROLE VARCHAR(45) DEFAULT NULL, + TENANT_ID INTEGER DEFAULT 0, + PRIMARY KEY (ID), + CONSTRAINT fk_DM_ROLE_GROUP_MAP_DM_GROUP2 FOREIGN KEY (GROUP_ID) + REFERENCES DM_GROUP (ID) ON DELETE CASCADE ON UPDATE CASCADE +); + +CREATE TABLE IF NOT EXISTS DM_DEVICE +( + ID INTEGER auto_increment NOT NULL, + DESCRIPTION TEXT DEFAULT NULL, + NAME VARCHAR(100) DEFAULT NULL, + DEVICE_TYPE_ID INT(11) DEFAULT NULL, + DEVICE_IDENTIFICATION VARCHAR(300) DEFAULT NULL, + LAST_UPDATED_TIMESTAMP TIMESTAMP NOT NULL, + TENANT_ID INTEGER DEFAULT 0, + PRIMARY KEY (ID), + CONSTRAINT fk_DM_DEVICE_DM_DEVICE_TYPE2 FOREIGN KEY (DEVICE_TYPE_ID) + REFERENCES DM_DEVICE_TYPE (ID) ON DELETE NO ACTION ON UPDATE NO ACTION, + CONSTRAINT uk_DM_DEVICE UNIQUE (NAME, DEVICE_TYPE_ID, DEVICE_IDENTIFICATION, TENANT_ID) +); + +CREATE TABLE IF NOT EXISTS DM_DEVICE_PROPERTIES +( + DEVICE_TYPE_NAME VARCHAR(300) NOT NULL, + DEVICE_IDENTIFICATION VARCHAR(300) NOT NULL, + PROPERTY_NAME VARCHAR(100) DEFAULT 0, + PROPERTY_VALUE VARCHAR(100) DEFAULT NULL, + TENANT_ID VARCHAR(100), + PRIMARY KEY (DEVICE_TYPE_NAME, DEVICE_IDENTIFICATION, PROPERTY_NAME, TENANT_ID) +); + +CREATE TABLE IF NOT EXISTS GROUP_PROPERTIES +( + GROUP_ID INTEGER NOT NULL, + PROPERTY_NAME VARCHAR(100) DEFAULT 0, + PROPERTY_VALUE VARCHAR(100) DEFAULT NULL, + TENANT_ID VARCHAR(100), + PRIMARY KEY (GROUP_ID, PROPERTY_NAME, TENANT_ID) +); + +CREATE TABLE IF NOT EXISTS DM_DEVICE_GROUP_MAP +( + ID INTEGER AUTO_INCREMENT NOT NULL, + DEVICE_ID INTEGER DEFAULT NULL, + GROUP_ID INTEGER DEFAULT NULL, + TENANT_ID INTEGER DEFAULT 0, + PRIMARY KEY (ID), + CONSTRAINT fk_DM_DEVICE_GROUP_MAP_DM_DEVICE2 FOREIGN KEY (DEVICE_ID) + REFERENCES DM_DEVICE (ID) ON DELETE CASCADE ON UPDATE CASCADE, + CONSTRAINT fk_DM_DEVICE_GROUP_MAP_DM_GROUP2 FOREIGN KEY (GROUP_ID) + REFERENCES DM_GROUP (ID) ON DELETE CASCADE ON UPDATE CASCADE +); + +CREATE TABLE IF NOT EXISTS DM_OPERATION +( + ID INTEGER AUTO_INCREMENT NOT NULL, + TYPE VARCHAR(50) NOT NULL, + CREATED_TIMESTAMP TIMESTAMP NOT NULL, + RECEIVED_TIMESTAMP TIMESTAMP NULL, + OPERATION_CODE VARCHAR(1000) NOT NULL, + INITIATED_BY VARCHAR(100) NULL, + OPERATION_DETAILS BLOB DEFAULT NULL, + ENABLED BOOLEAN NOT NULL DEFAULT FALSE, + PRIMARY KEY (ID) +); + +CREATE TABLE IF NOT EXISTS DM_ENROLMENT +( + ID INTEGER AUTO_INCREMENT NOT NULL, + DEVICE_ID INTEGER NOT NULL, + OWNER VARCHAR(255) NOT NULL, + OWNERSHIP VARCHAR(45) DEFAULT NULL, + STATUS VARCHAR(50) NULL, + IS_TRANSFERRED BOOLEAN NOT NULL DEFAULT FALSE, + DATE_OF_ENROLMENT TIMESTAMP DEFAULT NULL, + DATE_OF_LAST_UPDATE TIMESTAMP DEFAULT NULL, + TENANT_ID INT NOT NULL, + PRIMARY KEY (ID), + CONSTRAINT fk_dm_device_enrolment FOREIGN KEY (DEVICE_ID) REFERENCES + DM_DEVICE (ID) ON DELETE NO ACTION ON UPDATE NO ACTION, + CONSTRAINT uk_dm_device_enrolment UNIQUE (DEVICE_ID, OWNER, OWNERSHIP, TENANT_ID) +); + +CREATE TABLE IF NOT EXISTS DM_ENROLMENT_OP_MAPPING +( + ID INTEGER AUTO_INCREMENT NOT NULL, + ENROLMENT_ID INTEGER NOT NULL, + OPERATION_ID INTEGER NOT NULL, + STATUS VARCHAR(50) NULL, + PUSH_NOTIFICATION_STATUS VARCHAR(50) NULL, + CREATED_TIMESTAMP INT NOT NULL, + UPDATED_TIMESTAMP INT NOT NULL, + OPERATION_CODE VARCHAR(50) NOT NULL, + INITIATED_BY VARCHAR(100) NULL, + TYPE VARCHAR(20) NOT NULL, + DEVICE_ID INTEGER DEFAULT NULL, + DEVICE_TYPE VARCHAR(300) NOT NULL, + DEVICE_IDENTIFICATION VARCHAR(300) DEFAULT NULL, + TENANT_ID INTEGER DEFAULT 0, + PRIMARY KEY (ID), + CONSTRAINT fk_dm_device_operation_mapping_device FOREIGN KEY (ENROLMENT_ID) REFERENCES + DM_ENROLMENT (ID) ON DELETE NO ACTION ON UPDATE NO ACTION, + CONSTRAINT fk_dm_device_operation_mapping_operation FOREIGN KEY (OPERATION_ID) REFERENCES + DM_OPERATION (ID) ON DELETE NO ACTION ON UPDATE NO ACTION +); + +CREATE TABLE IF NOT EXISTS DM_DEVICE_OPERATION_RESPONSE +( + ID INTEGER AUTO_INCREMENT NOT NULL, + ENROLMENT_ID INTEGER NOT NULL, + OPERATION_ID INTEGER NOT NULL, + EN_OP_MAP_ID INTEGER NOT NULL, + OPERATION_RESPONSE VARCHAR(1024) DEFAULT NULL, + IS_LARGE_RESPONSE BOOLEAN NOT NULL DEFAULT FALSE, + RECEIVED_TIMESTAMP TIMESTAMP NULL, + PRIMARY KEY (ID), + CONSTRAINT fk_dm_device_operation_response_enrollment FOREIGN KEY (ENROLMENT_ID) REFERENCES + DM_ENROLMENT (ID) ON DELETE NO ACTION ON UPDATE NO ACTION, + CONSTRAINT fk_dm_device_operation_response_operation FOREIGN KEY (OPERATION_ID) REFERENCES + DM_OPERATION (ID) ON DELETE NO ACTION ON UPDATE NO ACTION, + CONSTRAINT fk_dm_en_op_map_response FOREIGN KEY (EN_OP_MAP_ID) REFERENCES + DM_ENROLMENT_OP_MAPPING (ID) ON DELETE NO ACTION ON UPDATE NO ACTION +); + +CREATE TABLE IF NOT EXISTS DM_DEVICE_OPERATION_RESPONSE_LARGE +( + ID INTEGER NOT NULL, + OPERATION_RESPONSE LONGBLOB DEFAULT NULL, + OPERATION_ID INTEGER NOT NULL, + EN_OP_MAP_ID INTEGER NOT NULL, + RECEIVED_TIMESTAMP TIMESTAMP NULL, + DEVICE_IDENTIFICATION VARCHAR(300) DEFAULT NULL, + CONSTRAINT fk_dm_device_operation_response_large_mapping FOREIGN KEY (ID) + REFERENCES DM_DEVICE_OPERATION_RESPONSE (ID) + ON DELETE NO ACTION ON UPDATE NO ACTION, + CONSTRAINT fk_dm_en_op_map_response_large FOREIGN KEY (EN_OP_MAP_ID) + REFERENCES DM_ENROLMENT_OP_MAPPING (ID) + ON DELETE NO ACTION ON UPDATE NO ACTION +); + +-- POLICY RELATED TABLES -- + +CREATE TABLE IF NOT EXISTS DM_PROFILE +( + ID INT NOT NULL AUTO_INCREMENT, + PROFILE_NAME VARCHAR(45) NOT NULL, + TENANT_ID INT NOT NULL, + DEVICE_TYPE VARCHAR(300) NOT NULL, + CREATED_TIME DATETIME NOT NULL, + UPDATED_TIME DATETIME NOT NULL, + PRIMARY KEY (ID) +); + +CREATE TABLE IF NOT EXISTS DM_POLICY +( + ID INT(11) NOT NULL AUTO_INCREMENT, + NAME VARCHAR(45) DEFAULT NULL, + DESCRIPTION VARCHAR(1000) NULL, + PAYLOAD_VERSION VARCHAR(45) NULL, + TENANT_ID INT(11) NOT NULL, + PROFILE_ID INT(11) NOT NULL, + OWNERSHIP_TYPE VARCHAR(45) NULL, + COMPLIANCE VARCHAR(100) NULL, + PRIORITY INT NOT NULL, + ACTIVE INT(2) NOT NULL, + UPDATED INT(1) NULL, + POLICY_TYPE VARCHAR(45) NULL, + PRIMARY KEY (ID), + CONSTRAINT FK_DM_PROFILE_DM_POLICY + FOREIGN KEY (PROFILE_ID) + REFERENCES DM_PROFILE (ID) + ON DELETE NO ACTION + ON UPDATE NO ACTION +); + +CREATE TABLE IF NOT EXISTS DM_DEVICE_POLICY +( + ID INT(11) NOT NULL AUTO_INCREMENT, + DEVICE_ID INT(11) NOT NULL, + ENROLMENT_ID INT(11) NOT NULL, + DEVICE BLOB NOT NULL, + POLICY_ID INT(11) NOT NULL, + PRIMARY KEY (ID), + CONSTRAINT FK_POLICY_DEVICE_POLICY + FOREIGN KEY (POLICY_ID) + REFERENCES DM_POLICY (ID) + ON DELETE NO ACTION + ON UPDATE NO ACTION, + CONSTRAINT FK_DEVICE_DEVICE_POLICY + FOREIGN KEY (DEVICE_ID) + REFERENCES DM_DEVICE (ID) + ON DELETE NO ACTION + ON UPDATE NO ACTION +); + +CREATE TABLE IF NOT EXISTS DM_DEVICE_TYPE_POLICY +( + ID INT(11) NOT NULL, + DEVICE_TYPE VARCHAR(300) NOT NULL, + POLICY_ID INT(11) NOT NULL, + PRIMARY KEY (ID), + CONSTRAINT FK_DEVICE_TYPE_POLICY + FOREIGN KEY (POLICY_ID) + REFERENCES DM_POLICY (ID) + ON DELETE NO ACTION + ON UPDATE NO ACTION +); + +CREATE TABLE IF NOT EXISTS DM_PROFILE_FEATURES +( + ID INT(11) NOT NULL AUTO_INCREMENT, + PROFILE_ID INT(11) NOT NULL, + FEATURE_CODE VARCHAR(100) NOT NULL, + DEVICE_TYPE VARCHAR(300) NOT NULL, + TENANT_ID INT(11) NOT NULL, + CONTENT BLOB NULL DEFAULT NULL, + PRIMARY KEY (ID), + CONSTRAINT FK_DM_PROFILE_DM_POLICY_FEATURES + FOREIGN KEY (PROFILE_ID) + REFERENCES DM_PROFILE (ID) + ON DELETE NO ACTION + ON UPDATE NO ACTION +); + +CREATE TABLE IF NOT EXISTS DM_POLICY_CORRECTIVE_ACTION +( + ID INT(11) NOT NULL AUTO_INCREMENT, + ACTION_TYPE VARCHAR(45) NOT NULL, + CORRECTIVE_POLICY_ID INT(11) DEFAULT NULL, + POLICY_ID INT(11) NOT NULL, + FEATURE_ID INT(11) DEFAULT NULL, + IS_REACTIVE BOOLEAN NOT NULL DEFAULT FALSE, + PRIMARY KEY (ID), + CONSTRAINT FK_DM_POLICY_DM_POLICY_CORRECTIVE_ACTION + FOREIGN KEY (POLICY_ID) + REFERENCES DM_POLICY (ID) + ON DELETE NO ACTION + ON UPDATE NO ACTION +); + +CREATE TABLE IF NOT EXISTS DM_ROLE_POLICY +( + ID INT(11) NOT NULL AUTO_INCREMENT, + ROLE_NAME VARCHAR(45) NOT NULL, + POLICY_ID INT(11) NOT NULL, + PRIMARY KEY (ID), + CONSTRAINT FK_ROLE_POLICY_POLICY + FOREIGN KEY (POLICY_ID) + REFERENCES DM_POLICY (ID) + ON DELETE NO ACTION + ON UPDATE NO ACTION +); + +CREATE TABLE IF NOT EXISTS DM_USER_POLICY +( + ID INT NOT NULL AUTO_INCREMENT, + POLICY_ID INT NOT NULL, + USERNAME VARCHAR(45) NOT NULL, + PRIMARY KEY (ID), + CONSTRAINT DM_POLICY_USER_POLICY + FOREIGN KEY (POLICY_ID) + REFERENCES DM_POLICY (ID) + ON DELETE NO ACTION + ON UPDATE NO ACTION +); + +CREATE TABLE IF NOT EXISTS DM_DEVICE_POLICY_APPLIED +( + ID INT NOT NULL AUTO_INCREMENT, + DEVICE_ID INT NOT NULL, + ENROLMENT_ID INT(11) NOT NULL, + POLICY_ID INT NOT NULL, + POLICY_CONTENT BLOB NULL, + TENANT_ID INT NOT NULL, + APPLIED TINYINT(1) NULL, + CREATED_TIME TIMESTAMP NULL, + UPDATED_TIME TIMESTAMP NULL, + APPLIED_TIME TIMESTAMP NULL, + PRIMARY KEY (ID), + CONSTRAINT FK_DM_POLICY_DEVCIE_APPLIED + FOREIGN KEY (DEVICE_ID) + REFERENCES DM_DEVICE (ID) + ON DELETE NO ACTION + ON UPDATE NO ACTION +); + +CREATE TABLE IF NOT EXISTS DM_CRITERIA +( + ID INT NOT NULL AUTO_INCREMENT, + TENANT_ID INT NOT NULL, + NAME VARCHAR(50) NULL, + PRIMARY KEY (ID) +); + +CREATE TABLE IF NOT EXISTS DM_POLICY_CRITERIA +( + ID INT NOT NULL AUTO_INCREMENT, + CRITERIA_ID INT NOT NULL, + POLICY_ID INT NOT NULL, + PRIMARY KEY (ID), + CONSTRAINT FK_CRITERIA_POLICY_CRITERIA + FOREIGN KEY (CRITERIA_ID) + REFERENCES DM_CRITERIA (ID) + ON DELETE NO ACTION + ON UPDATE NO ACTION, + CONSTRAINT FK_POLICY_POLICY_CRITERIA + FOREIGN KEY (POLICY_ID) + REFERENCES DM_POLICY (ID) + ON DELETE NO ACTION + ON UPDATE NO ACTION +); + +CREATE TABLE IF NOT EXISTS DM_POLICY_CRITERIA_PROPERTIES +( + ID INT NOT NULL AUTO_INCREMENT, + POLICY_CRITERION_ID INT NOT NULL, + PROP_KEY VARCHAR(45) NULL, + PROP_VALUE VARCHAR(100) NULL, + CONTENT BLOB NULL, + PRIMARY KEY (ID), + CONSTRAINT FK_POLICY_CRITERIA_PROPERTIES + FOREIGN KEY (POLICY_CRITERION_ID) + REFERENCES DM_POLICY_CRITERIA (ID) + ON DELETE CASCADE + ON UPDATE NO ACTION +); + +CREATE TABLE IF NOT EXISTS DM_POLICY_COMPLIANCE_STATUS +( + ID INT NOT NULL AUTO_INCREMENT, + DEVICE_ID INT NOT NULL, + ENROLMENT_ID INT(11) NOT NULL, + POLICY_ID INT NOT NULL, + TENANT_ID INT NOT NULL, + STATUS INT NULL, + LAST_SUCCESS_TIME TIMESTAMP NULL, + LAST_REQUESTED_TIME TIMESTAMP NULL, + LAST_FAILED_TIME TIMESTAMP NULL, + ATTEMPTS INT NULL, + PRIMARY KEY (ID) +); + +CREATE TABLE IF NOT EXISTS DM_POLICY_CHANGE_MGT +( + ID INT NOT NULL AUTO_INCREMENT, + POLICY_ID INT NOT NULL, + DEVICE_TYPE VARCHAR(300) NOT NULL, + TENANT_ID INT(11) NOT NULL, + PRIMARY KEY (ID) +); + +CREATE TABLE IF NOT EXISTS DM_POLICY_COMPLIANCE_FEATURES +( + ID INT NOT NULL AUTO_INCREMENT, + COMPLIANCE_STATUS_ID INT NOT NULL, + TENANT_ID INT NOT NULL, + FEATURE_CODE VARCHAR(100) NOT NULL, + STATUS INT NULL, + PRIMARY KEY (ID), + CONSTRAINT FK_COMPLIANCE_FEATURES_STATUS + FOREIGN KEY (COMPLIANCE_STATUS_ID) + REFERENCES DM_POLICY_COMPLIANCE_STATUS (ID) + ON DELETE NO ACTION + ON UPDATE NO ACTION +); + +CREATE TABLE IF NOT EXISTS DM_APPLICATION +( + ID INTEGER AUTO_INCREMENT NOT NULL, + NAME VARCHAR(150) NOT NULL, + APP_IDENTIFIER VARCHAR(150) NOT NULL, + PLATFORM VARCHAR(50) DEFAULT NULL, + CATEGORY VARCHAR(50) NULL, + VERSION VARCHAR(50) NULL, + TYPE VARCHAR(50) NULL, + LOCATION_URL VARCHAR(100) DEFAULT NULL, + IMAGE_URL VARCHAR(100) DEFAULT NULL, + APP_PROPERTIES BLOB NULL, + MEMORY_USAGE INTEGER(10) NULL, + IS_ACTIVE BOOLEAN NOT NULL DEFAULT FALSE, + DEVICE_ID INTEGER NOT NULL, + ENROLMENT_ID INTEGER NOT NULL, + TENANT_ID INTEGER NOT NULL, + PRIMARY KEY (ID), + CONSTRAINT fk_dm_device + FOREIGN KEY (DEVICE_ID) + REFERENCES DM_DEVICE (ID) + ON DELETE NO ACTION + ON UPDATE NO ACTION, + CONSTRAINT fk_dm_enrolement + FOREIGN KEY (ENROLMENT_ID) + REFERENCES DM_ENROLMENT (ID) + ON DELETE NO ACTION + ON UPDATE NO ACTION +); + +-- POLICY RELATED TABLES FINISHED -- + +-- NOTIFICATION TABLE -- +CREATE TABLE IF NOT EXISTS DM_NOTIFICATION +( + NOTIFICATION_ID INTEGER AUTO_INCREMENT NOT NULL, + DEVICE_ID INTEGER NOT NULL, + OPERATION_ID INTEGER NULL, + TENANT_ID INTEGER NOT NULL, + STATUS VARCHAR(10) NULL, + DESCRIPTION VARCHAR(1000) NULL, + LAST_UPDATED_TIMESTAMP TIMESTAMP NOT NULL, + PRIMARY KEY (NOTIFICATION_ID), + CONSTRAINT fk_dm_device_notification FOREIGN KEY (DEVICE_ID) REFERENCES + DM_DEVICE (ID) ON DELETE NO ACTION ON UPDATE NO ACTION +); +-- NOTIFICATION TABLE END -- + +CREATE TABLE IF NOT EXISTS DM_DEVICE_INFO +( + ID INTEGER AUTO_INCREMENT NOT NULL, + DEVICE_ID INT NULL, + ENROLMENT_ID INT NOT NULL, + KEY_FIELD VARCHAR(45) NULL, + VALUE_FIELD VARCHAR(1000) NULL, + PRIMARY KEY (ID), + CONSTRAINT DM_DEVICE_INFO_DEVICE + FOREIGN KEY (DEVICE_ID) + REFERENCES DM_DEVICE (ID) + ON DELETE NO ACTION + ON UPDATE NO ACTION, + CONSTRAINT DM_DEVICE_INFO_DEVICE_ENROLLMENT + FOREIGN KEY (ENROLMENT_ID) + REFERENCES DM_ENROLMENT (ID) + ON DELETE NO ACTION + ON UPDATE NO ACTION +); + +CREATE INDEX IDX_DM_DEVICE_INFO_DID_EID_KFIELD ON DM_DEVICE_INFO (DEVICE_ID, ENROLMENT_ID, KEY_FIELD); + +CREATE TABLE IF NOT EXISTS DM_DEVICE_LOCATION +( + ID INTEGER AUTO_INCREMENT NOT NULL, + DEVICE_ID INT NULL, + ENROLMENT_ID INT NOT NULL, + LATITUDE DOUBLE NULL, + LONGITUDE DOUBLE NULL, + STREET1 VARCHAR(255) NULL, + STREET2 VARCHAR(45) NULL, + CITY VARCHAR(45) NULL, + ZIP VARCHAR(10) NULL, + STATE VARCHAR(45) NULL, + COUNTRY VARCHAR(45) NULL, + GEO_HASH VARCHAR(45) NULL, + UPDATE_TIMESTAMP BIGINT(15) NOT NULL, + ALTITUDE DOUBLE NULL, + SPEED FLOAT NULL, + BEARING FLOAT NULL, + DISTANCE DOUBLE NULL, + PRIMARY KEY (ID), + CONSTRAINT DM_DEVICE_LOCATION_DEVICE + FOREIGN KEY (DEVICE_ID) + REFERENCES DM_DEVICE (ID) + ON DELETE NO ACTION + ON UPDATE NO ACTION, + CONSTRAINT DM_DEVICE_LOCATION_DM_ENROLLMENT + FOREIGN KEY (ENROLMENT_ID) + REFERENCES DM_ENROLMENT (ID) + ON DELETE NO ACTION + ON UPDATE NO ACTION +); +CREATE INDEX DM_DEVICE_LOCATION_GEO_hashx ON DM_DEVICE_LOCATION (GEO_HASH ASC); + +CREATE TABLE IF NOT EXISTS DM_DEVICE_DETAIL +( + ID INT NOT NULL AUTO_INCREMENT, + DEVICE_ID INT NOT NULL, + ENROLMENT_ID INT NOT NULL, + DEVICE_MODEL VARCHAR(45) NULL, + VENDOR VARCHAR(45) NULL, + OS_VERSION VARCHAR(45) NULL, + OS_BUILD_DATE VARCHAR(100) NULL, + BATTERY_LEVEL DECIMAL(4) NULL, + INTERNAL_TOTAL_MEMORY DECIMAL(30, 3) NULL, + INTERNAL_AVAILABLE_MEMORY DECIMAL(30, 3) NULL, + EXTERNAL_TOTAL_MEMORY DECIMAL(30, 3) NULL, + EXTERNAL_AVAILABLE_MEMORY DECIMAL(30, 3) NULL, + CONNECTION_TYPE VARCHAR(50) NULL, + SSID VARCHAR(45) NULL, + CPU_USAGE DECIMAL(5) NULL, + TOTAL_RAM_MEMORY DECIMAL(30, 3) NULL, + AVAILABLE_RAM_MEMORY DECIMAL(30, 3) NULL, + PLUGGED_IN INT(1) NULL, + UPDATE_TIMESTAMP BIGINT(15) NOT NULL, + PRIMARY KEY (ID), + CONSTRAINT FK_DM_DEVICE_DETAILS_DEVICE + FOREIGN KEY (DEVICE_ID) + REFERENCES DM_DEVICE (ID) + ON DELETE NO ACTION + ON UPDATE NO ACTION, + CONSTRAINT FK_DM_ENROLMENT_DEVICE_DETAILS + FOREIGN KEY (ENROLMENT_ID) + REFERENCES DM_ENROLMENT (ID) + ON DELETE NO ACTION + ON UPDATE NO ACTION +); + +CREATE INDEX IDX_DM_DEVICE_DETAIL_DID_EID ON DM_DEVICE_DETAIL (DEVICE_ID, ENROLMENT_ID); + +CREATE TABLE IF NOT EXISTS DM_DEVICE_HISTORY_LAST_SEVEN_DAYS +( + ID INTEGER AUTO_INCREMENT NOT NULL, + DEVICE_ID INT NOT NULL, + DEVICE_ID_NAME VARCHAR(255) NOT NULL, + TENANT_ID INT NOT NULL, + DEVICE_TYPE_NAME VARCHAR(45) NOT NULL, + LATITUDE DOUBLE NULL, + LONGITUDE DOUBLE NULL, + SPEED FLOAT NULL, + HEADING FLOAT NULL, + TIMESTAMP BIGINT(15) NOT NULL, + GEO_HASH VARCHAR(45) NULL, + DEVICE_OWNER VARCHAR(45) NULL, + DEVICE_ALTITUDE DOUBLE NULL, + DISTANCE DOUBLE NULL, + PRIMARY KEY (ID) +); + +-- POLICY AND DEVICE GROUP MAPPING -- +CREATE TABLE IF NOT EXISTS DM_DEVICE_GROUP_POLICY +( + ID INT NOT NULL AUTO_INCREMENT, + DEVICE_GROUP_ID INT NOT NULL, + POLICY_ID INT NOT NULL, + TENANT_ID INT NOT NULL, + PRIMARY KEY (ID), + CONSTRAINT FK_DM_DEVICE_GROUP_POLICY + FOREIGN KEY (DEVICE_GROUP_ID) + REFERENCES DM_GROUP (ID) + ON DELETE CASCADE + ON UPDATE CASCADE, + CONSTRAINT FK_DM_DEVICE_GROUP_DM_POLICY + FOREIGN KEY (POLICY_ID) + REFERENCES DM_POLICY (ID) + ON DELETE CASCADE + ON UPDATE CASCADE +); +-- END OF POLICY AND DEVICE GROUP MAPPING -- + + +CREATE TABLE IF NOT EXISTS DM_DEVICE_TYPE_PLATFORM +( + ID INT NOT NULL AUTO_INCREMENT, + DEVICE_TYPE_ID INT NULL DEFAULT 0, + VERSION_NAME VARCHAR(100) NULL, + VERSION_STATUS VARCHAR(100) NULL DEFAULT 'ACTIVE', + PRIMARY KEY (ID), + CONSTRAINT DM_DEVICE_TYPE_DM_DEVICE_TYPE_PLATFORM_MAPPING + FOREIGN KEY (DEVICE_TYPE_ID) + REFERENCES DM_DEVICE_TYPE (ID) ON DELETE CASCADE ON UPDATE CASCADE, + CONSTRAINT device_type_version_uk + UNIQUE ( + DEVICE_TYPE_ID, + VERSION_NAME + ) +); + +-- METADATA TABLE -- +CREATE TABLE IF NOT EXISTS DM_METADATA +( + METADATA_ID INT AUTO_INCREMENT NOT NULL, + DATA_TYPE VARCHAR(16) NOT NULL, + METADATA_KEY VARCHAR(128) NOT NULL, + METADATA_VALUE VARCHAR(8000) NOT NULL, + TENANT_ID INTEGER NOT NULL, + PRIMARY KEY (METADATA_ID), + CONSTRAINT METADATA_KEY_TENANT_ID UNIQUE (METADATA_KEY, TENANT_ID) +); +-- END OF METADATA TABLE -- + +-- DM_OTP_DATA TABLE -- +CREATE TABLE IF NOT EXISTS DM_OTP_DATA +( + ID INT AUTO_INCREMENT NOT NULL, + OTP_TOKEN VARCHAR(100) NOT NULL, + TENANT_ID INT NOT NULL, + USERNAME VARCHAR(500) DEFAULT NOT NULL, + EMAIL VARCHAR(100) NOT NULL, + EMAIL_TYPE VARCHAR(20) NOT NULL, + META_INFO VARCHAR(20000) NOT NULL, + CREATED_AT TIMESTAMP NOT NULL, + EXPIRY_TIME INT NOT NULL DEFAULT 3600, + IS_EXPIRED BOOLEAN DEFAULT false, + PRIMARY KEY (ID) +); +-- END OF DM_OTP_DATA TABLE -- + +-- DASHBOARD RELATED VIEWS -- +CREATE VIEW POLICY_COMPLIANCE_INFO AS +SELECT DEVICE_INFO.DEVICE_ID, + DEVICE_INFO.DEVICE_IDENTIFICATION, + DEVICE_INFO.PLATFORM, + DEVICE_INFO.OWNERSHIP, + DEVICE_INFO.CONNECTIVITY_STATUS, + IFNULL(DEVICE_WITH_POLICY_INFO.POLICY_ID, -1) AS POLICY_ID, + IFNULL(DEVICE_WITH_POLICY_INFO.IS_COMPLIANT, -1) AS IS_COMPLIANT, + DEVICE_INFO.TENANT_ID +FROM (SELECT DM_DEVICE.ID AS DEVICE_ID, + DM_DEVICE.DEVICE_IDENTIFICATION, + DM_DEVICE_TYPE.NAME AS PLATFORM, + DM_ENROLMENT.OWNERSHIP, + DM_ENROLMENT.STATUS AS CONNECTIVITY_STATUS, + DM_DEVICE.TENANT_ID + FROM DM_DEVICE, + DM_DEVICE_TYPE, + DM_ENROLMENT + WHERE DM_DEVICE.DEVICE_TYPE_ID = DM_DEVICE_TYPE.ID + AND DM_DEVICE.ID = DM_ENROLMENT.DEVICE_ID) DEVICE_INFO + LEFT JOIN + (SELECT DEVICE_ID, + POLICY_ID, + STATUS AS IS_COMPLIANT + FROM DM_POLICY_COMPLIANCE_STATUS) DEVICE_WITH_POLICY_INFO + ON DEVICE_INFO.DEVICE_ID = DEVICE_WITH_POLICY_INFO.DEVICE_ID +ORDER BY DEVICE_INFO.DEVICE_ID; + +CREATE VIEW FEATURE_NON_COMPLIANCE_INFO AS +SELECT DM_DEVICE.ID AS DEVICE_ID, + DM_DEVICE.DEVICE_IDENTIFICATION, + DM_DEVICE_DETAIL.DEVICE_MODEL, + DM_DEVICE_DETAIL.VENDOR, + DM_DEVICE_DETAIL.OS_VERSION, + DM_ENROLMENT.OWNERSHIP, + DM_ENROLMENT.OWNER, + DM_ENROLMENT.STATUS AS CONNECTIVITY_STATUS, + DM_POLICY_COMPLIANCE_STATUS.POLICY_ID, + DM_DEVICE_TYPE.NAME AS PLATFORM, + DM_POLICY_COMPLIANCE_FEATURES.FEATURE_CODE, + DM_POLICY_COMPLIANCE_FEATURES.STATUS AS IS_COMPLAINT, + DM_DEVICE.TENANT_ID +FROM DM_POLICY_COMPLIANCE_FEATURES, + DM_POLICY_COMPLIANCE_STATUS, + DM_ENROLMENT, + DM_DEVICE, + DM_DEVICE_TYPE, + DM_DEVICE_DETAIL +WHERE DM_POLICY_COMPLIANCE_FEATURES.COMPLIANCE_STATUS_ID = DM_POLICY_COMPLIANCE_STATUS.ID + AND DM_POLICY_COMPLIANCE_STATUS.ENROLMENT_ID = DM_ENROLMENT.ID + AND DM_POLICY_COMPLIANCE_STATUS.DEVICE_ID = DM_DEVICE.ID + AND DM_DEVICE.DEVICE_TYPE_ID = DM_DEVICE_TYPE.ID + AND DM_DEVICE.ID = DM_DEVICE_DETAIL.DEVICE_ID +ORDER BY TENANT_ID, DEVICE_ID; + +-- END OF DASHBOARD RELATED VIEWS -- + +-- DM_GEOFENCE TABLE-- + +CREATE TABLE IF NOT EXISTS DM_GEOFENCE +( + ID INT NOT NULL AUTO_INCREMENT, + FENCE_NAME VARCHAR(255) NOT NULL, + DESCRIPTION TEXT DEFAULT NULL, + LATITUDE DOUBLE DEFAULT NULL, + LONGITUDE DOUBLE DEFAULT NULL, + RADIUS DOUBLE DEFAULT NULL, + GEO_JSON TEXT DEFAULT NULL, + FENCE_SHAPE VARCHAR(100) DEFAULT NULL, + CREATED_TIMESTAMP TIMESTAMP NOT NULL, + OWNER VARCHAR(255) NOT NULL, + TENANT_ID INTEGER DEFAULT 0, + PRIMARY KEY (ID) +); + +-- END OF DM_GEOFENCE TABLE-- + +-- DM_GEOFENCE_GROUP_MAPPING TABLE-- +CREATE TABLE IF NOT EXISTS DM_GEOFENCE_GROUP_MAPPING +( + ID INT NOT NULL AUTO_INCREMENT, + FENCE_ID INT NOT NULL, + GROUP_ID INT NOT NULL, + PRIMARY KEY (ID), + CONSTRAINT fk_dm_geofence_group_mapping_geofence FOREIGN KEY (FENCE_ID) REFERENCES + DM_GEOFENCE (ID) ON DELETE NO ACTION ON UPDATE NO ACTION, + CONSTRAINT fk_dm_geofence_group_mapping_group FOREIGN KEY (GROUP_ID) REFERENCES + DM_GROUP (ID) ON DELETE NO ACTION ON UPDATE NO ACTION +); + +-- END OF DM_GEOFENCE_GROUP_MAPPING TABLE-- + +-- DM_DEVICE_EVENT TABLE -- + +CREATE TABLE IF NOT EXISTS DM_DEVICE_EVENT +( + ID INT NOT NULL AUTO_INCREMENT, + EVENT_SOURCE VARCHAR(100) NOT NULL, + EVENT_LOGIC VARCHAR(100) NOT NULL, + ACTIONS TEXT DEFAULT NULL, + CREATED_TIMESTAMP TIMESTAMP NOT NULL, + TENANT_ID INTEGER DEFAULT 0, + PRIMARY KEY (ID) +); + +-- END OF DM_DEVICE_EVENT TABLE -- + +-- DM_DEVICE_EVENT_GROUP_MAPPING TABLE-- +CREATE TABLE IF NOT EXISTS DM_DEVICE_EVENT_GROUP_MAPPING +( + ID INT NOT NULL AUTO_INCREMENT, + EVENT_ID INT NOT NULL, + GROUP_ID INT NOT NULL, + PRIMARY KEY (ID), + CONSTRAINT fk_dm_event_group_mapping_event FOREIGN KEY (EVENT_ID) REFERENCES + DM_DEVICE_EVENT (ID) ON DELETE NO ACTION ON UPDATE NO ACTION, + CONSTRAINT fk_dm_event_group_mapping_group FOREIGN KEY (GROUP_ID) REFERENCES + DM_GROUP (ID) ON DELETE NO ACTION ON UPDATE NO ACTION +); + +-- END OF DM_DEVICE_EVENT_GROUP_MAPPING TABLE-- + +-- DM_GEOFENCE_GROUP_MAPPING TABLE-- +CREATE TABLE IF NOT EXISTS DM_GEOFENCE_EVENT_MAPPING +( + ID INT NOT NULL AUTO_INCREMENT, + FENCE_ID INT NOT NULL, + EVENT_ID INT NOT NULL, + PRIMARY KEY (ID), + CONSTRAINT fk_dm_geofence_event_mapping_geofence FOREIGN KEY (FENCE_ID) REFERENCES + DM_GEOFENCE (ID) ON DELETE NO ACTION ON UPDATE NO ACTION, + CONSTRAINT fk_dm_geofence_event_mapping_event FOREIGN KEY (EVENT_ID) REFERENCES + DM_DEVICE_EVENT (ID) ON DELETE NO ACTION ON UPDATE NO ACTION +); + +-- END OF DM_GEOFENCE_GROUP_MAPPING TABLE-- + +-- DM_EXT_GROUP_MAPPING TABLE-- +CREATE TABLE IF NOT EXISTS DM_EXT_GROUP_MAPPING +( + ID INT NOT NULL AUTO_INCREMENT, + TRACCAR_GROUP_ID INT DEFAULT 0, + GROUP_ID INT NOT NULL, + TENANT_ID INT NOT NULL, + STATUS INT DEFAULT 0, + PRIMARY KEY (ID) +); +-- END OF DM_EXT_GROUP_MAPPING TABLE-- + +-- END OF DM_EXT_DEVICE_MAPPING TABLE-- +CREATE TABLE IF NOT EXISTS DM_EXT_DEVICE_MAPPING +( + ID INT NOT NULL AUTO_INCREMENT, + TRACCAR_DEVICE_ID INT DEFAULT 0, + DEVICE_ID INT NOT NULL, + TENANT_ID INT NOT NULL, + STATUS INT DEFAULT 0, + PRIMARY KEY (ID) +); +/* + * Copyright (c) 2018 - 2023, 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. + */ + +-- END OF DM_EXT_DEVICE_MAPPING TABLE-- + +-- END OF DM_EXT_PERMISSION_MAPPING TABLE-- +CREATE TABLE IF NOT EXISTS DM_EXT_PERMISSION_MAPPING +( + TRACCAR_DEVICE_ID INT DEFAULT 0, + TRACCAR_USER_ID INT DEFAULT 0 +); +-- END OF DM_EXT_PERMISSION_MAPPING TABLE-- + +-- DYNAMIC TASK TABLES-- +CREATE TABLE IF NOT EXISTS DYNAMIC_TASK +( + DYNAMIC_TASK_ID INTEGER AUTO_INCREMENT NOT NULL, + NAME VARCHAR(300) DEFAULT NULL, + CRON VARCHAR(8000) DEFAULT NULL, + IS_ENABLED BOOLEAN NOT NULL DEFAULT FALSE, + TASK_CLASS_NAME VARCHAR(8000) DEFAULT NULL, + TENANT_ID INTEGER DEFAULT 0, + PRIMARY KEY (DYNAMIC_TASK_ID) +); + +CREATE TABLE IF NOT EXISTS DYNAMIC_TASK_PROPERTIES +( + DYNAMIC_TASK_ID INTEGER NOT NULL, + PROPERTY_NAME VARCHAR(100) DEFAULT 0, + PROPERTY_VALUE VARCHAR(100) DEFAULT NULL, + TENANT_ID VARCHAR(100), + PRIMARY KEY (DYNAMIC_TASK_ID, PROPERTY_NAME, TENANT_ID), + CONSTRAINT FK_DYNAMIC_TASK_TASK_PROPERTIES FOREIGN KEY (DYNAMIC_TASK_ID) REFERENCES + DYNAMIC_TASK (DYNAMIC_TASK_ID) ON DELETE CASCADE ON UPDATE CASCADE +); +-- END OF DYNAMIC TASK TABLE-- + +-- DM_DEVICE_SUB_TYPE TABLE-- +CREATE TABLE IF NOT EXISTS DM_DEVICE_SUB_TYPE +( + TENANT_ID INT DEFAULT 0, + SUB_TYPE_ID VARCHAR(45) NOT NULL, + DEVICE_TYPE VARCHAR(25) NOT NULL, + SUB_TYPE_NAME VARCHAR(45) NOT NULL, + TYPE_DEFINITION TEXT NOT NULL, + PRIMARY KEY (SUB_TYPE_ID, DEVICE_TYPE) +); +-- END OF DM_DEVICE_SUB_TYPE TABLE-- + +-- DM_DEVICE_ORGANIZATION TABLE-- +CREATE TABLE IF NOT EXISTS DM_DEVICE_ORGANIZATION +( + ORGANIZATION_ID INT NOT NULL AUTO_INCREMENT, + TENANT_ID INT DEFAULT 0, + DEVICE_ID INT(11) NOT NULL, + PARENT_DEVICE_ID INT(11) DEFAULT NULL, + DEVICE_ORGANIZATION_META TEXT DEFAULT NULL, + LAST_UPDATED_TIMESTAMP TIMESTAMP NOT NULL, + PRIMARY KEY (ORGANIZATION_ID), + CONSTRAINT fk_DM_DEVICE_DM_ID FOREIGN KEY (DEVICE_ID) + REFERENCES DM_DEVICE (ID) ON DELETE NO ACTION ON UPDATE NO ACTION, + CONSTRAINT fk_DM_PARENT_DEVICE_DM_ID FOREIGN KEY (PARENT_DEVICE_ID) + REFERENCES DM_DEVICE (ID) ON DELETE NO ACTION ON UPDATE NO ACTION, + CONSTRAINT CHILD_PARENT_COMP_KEY UNIQUE (DEVICE_ID, PARENT_DEVICE_ID) +); +-- END OF DM_DEVICE_ORGANIZATION TABLE-- \ No newline at end of file diff --git a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/carbon-home/dbscripts/h2.sql b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/carbon-home/dbscripts/h2.sql new file mode 100644 index 0000000000..d89dfd584b --- /dev/null +++ b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/carbon-home/dbscripts/h2.sql @@ -0,0 +1,65 @@ + /* + * Copyright (c) 2018 - 2023, 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. + */ -- ----------------------------------------------------- + -- Table `DM_DEVICE_ORGANIZATION` + -- ----------------------------------------------------- + + -- DM_DEVICE_ORGANIZATION TABLE-- + CREATE TABLE IF NOT EXISTS DM_DEVICE_ORGANIZATION ( + ORGANIZATION_ID INT NOT NULL AUTO_INCREMENT, + TENANT_ID INT DEFAULT 0, + DEVICE_ID INT(11) NOT NULL, + PARENT_DEVICE_ID INT(11) DEFAULT NULL, + DEVICE_ORGANIZATION_META TEXT DEFAULT NULL, + LAST_UPDATED_TIMESTAMP TIMESTAMP NOT NULL, + PRIMARY KEY (ORGANIZATION_ID), + CONSTRAINT fk_DM_DEVICE_DM_ID FOREIGN KEY (DEVICE_ID) + REFERENCES DM_DEVICE (ID) ON DELETE NO ACTION ON UPDATE NO ACTION, + CONSTRAINT fk_DM_PARENT_DEVICE_DM_ID FOREIGN KEY (PARENT_DEVICE_ID) + REFERENCES DM_DEVICE (ID) ON DELETE NO ACTION ON UPDATE NO ACTION, + CONSTRAINT CHILD_PARENT_COMP_KEY UNIQUE (DEVICE_ID, PARENT_DEVICE_ID) + ); + -- END OF DM_DEVICE_ORGANIZATION TABLE-- + +-- ----------------------------------------------------- +-- Sample data for test cases +-- ----------------------------------------------------- +INSERT INTO DM_DEVICE_TYPE (NAME,DEVICE_TYPE_META,LAST_UPDATED_TIMESTAMP,PROVIDER_TENANT_ID,SHARED_WITH_ALL_TENANTS) +VALUES ('METER','meter',CURRENT_TIMESTAMP(),1,true); +INSERT INTO DM_DEVICE (DESCRIPTION,NAME,DEVICE_TYPE_ID,DEVICE_IDENTIFICATION,LAST_UPDATED_TIMESTAMP,TENANT_ID) VALUES +('test device 1','Meter_01',1,'0001',CURRENT_TIMESTAMP(),1), +('test device 2','Meter_02',1,'0002',CURRENT_TIMESTAMP(),1), +('test device 3','Meter_03',1,'0003',CURRENT_TIMESTAMP(),1), +('test device 4','Meter_04',1,'0004',CURRENT_TIMESTAMP(),1), +('test device 5','Meter_05',1,'0005',CURRENT_TIMESTAMP(),1), +('test device 6','Meter_06',1,'0006',CURRENT_TIMESTAMP(),1), +('test device 7','Meter_07',1,'0007',CURRENT_TIMESTAMP(),1), +('test device 8','Meter_08',1,'0008',CURRENT_TIMESTAMP(),1), +('test device 9','Meter_09',1,'0009',CURRENT_TIMESTAMP(),1), +('test device 10','Meter_10',1,'0010',CURRENT_TIMESTAMP(),1), +('test device 11','Meter_11',1,'0011',CURRENT_TIMESTAMP(),1), +('test device 12','Meter_12',1,'0012',CURRENT_TIMESTAMP(),1), +('test device 13','Meter_13',1,'0013',CURRENT_TIMESTAMP(),1), +('test device 14','Meter_14',1,'0014',CURRENT_TIMESTAMP(),1), +('test device 15','Meter_15',1,'0015',CURRENT_TIMESTAMP(),1), +('test device 16','Meter_16',1,'0016',CURRENT_TIMESTAMP(),1), +('test device 17','Meter_17',1,'0017',CURRENT_TIMESTAMP(),1), +('test device 18','Meter_18',1,'0018',CURRENT_TIMESTAMP(),1), +('test device 19','Meter_19',1,'0019',CURRENT_TIMESTAMP(),1), +('test device 20','Meter_20',1,'0020',CURRENT_TIMESTAMP(),1) +; + diff --git a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/carbon-home/repository/conf/axis2/axis2.xml b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/carbon-home/repository/conf/axis2/axis2.xml new file mode 100644 index 0000000000..0e2dd85793 --- /dev/null +++ b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/carbon-home/repository/conf/axis2/axis2.xml @@ -0,0 +1,726 @@ + + + + + + + + + + + + + ${hotdeployment} + ${hotupdate} + optional + true + work/mtom + 4000 + + ${childfirstCL} + + + true + + + true + + + + false + + inmemory + + + + + + + services + + + axis2services + + + axis2modules + + + @product.name@-@product.version@ + + + @product.name@-@product.version@ + + + + + + + false + + + + + + false + + + true + + + repository/deployment/server/synapse-configs + + + + . + + + . + + + WSO2 Carbon Server + + + + + + + ${jaxwsparam} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 9763 + + + + + + + + + + + + 9443 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + HTTP/1.1 + chunked + + true + + + HTTP/1.1 + chunked + + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + true + + + multicast + + + + + wso2.carbon.domain + + + + + + 45564 + + 100 + + 60 + + + + + + 127.0.0.1 + + + + + + 4000 + + + + + + + + + + + + + + + + + + 127.0.0.1 + 4000 + + + + + + + + + diff --git a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/carbon-home/repository/conf/axis2/axis2_client.xml b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/carbon-home/repository/conf/axis2/axis2_client.xml new file mode 100644 index 0000000000..2fe95b6462 --- /dev/null +++ b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/carbon-home/repository/conf/axis2/axis2_client.xml @@ -0,0 +1,302 @@ + + + + + + + true + false + false + + + 500 + + 15000 + + + false + + + + true + + + + + + false + + + admin + axis2 + + + + + + + + + + + + + + + + + + + + + + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 6071 + + + + + + + + + + + + + + + + + + + + + + HTTP/1.1 + chunked + 60000 + 60000 + + + HTTP/1.1 + chunked + 60000 + 60000 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/carbon-home/repository/conf/axis2/tenant-axis2.xml b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/carbon-home/repository/conf/axis2/tenant-axis2.xml new file mode 100644 index 0000000000..086f86768a --- /dev/null +++ b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/carbon-home/repository/conf/axis2/tenant-axis2.xml @@ -0,0 +1,287 @@ + + + + + + + + + true + true + optional + + + true + + + false + + + + true + + + + + + false + + + false + + + axis2services + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/carbon-home/repository/conf/carbon.xml b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/carbon-home/repository/conf/carbon.xml new file mode 100644 index 0000000000..4067baf99f --- /dev/null +++ b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/carbon-home/repository/conf/carbon.xml @@ -0,0 +1,659 @@ + + + + + + + + + ${product.name} + + + ${product.key} + + + ${product.version} + + + + + + + + + local:/${carbon.context}/services/ + + + + + + + ${default.server.role} + + + + + + + org.wso2.carbon + + + / + + + + + + + + + 15 + + + + + + + + + 0 + + + + + 9999 + + 11111 + + + + + + 10389 + + 8000 + + + + + + 10500 + + + + + + + org.wso2.carbon.tomcat.jndi.CarbonJavaURLContextFactory + + + + + + + + + + java + + + + + + + + + + false + + + false + + + 600 + + + + false + + + + + + + + 30 + + + + + + + + + 15 + + + + + + ${carbon.home}/repository/deployment/server/ + + + 15 + + + ${carbon.home}/repository/conf/axis2/axis2.xml + + + 30000 + + + ${carbon.home}/repository/deployment/client/ + + ${carbon.home}/repository/conf/axis2/axis2_client.xml + + true + + + + + + + + + + admin + Default Administrator Role + + + user + Default User Role + + + + + + + + + + + + ${carbon.home}/repository/resources/security/wso2carbon.jks + + JKS + + wso2carbon + + wso2carbon + + wso2carbon + + + + + + ${carbon.home}/repository/resources/security/client-truststore.jks + + JKS + + wso2carbon + + + + + + + + + + + + + + + + + + + UserManager + + + false + + + + + + + ${carbon.home}/tmp/work + + + + + + true + + + 10 + + + 30 + + + + + + 100 + + + + keystore + certificate + * + + org.wso2.carbon.ui.transports.fileupload.AnyFileUploadExecutor + + + + + jarZip + + org.wso2.carbon.ui.transports.fileupload.JarZipUploadExecutor + + + + dbs + + org.wso2.carbon.ui.transports.fileupload.DBSFileUploadExecutor + + + + tools + + org.wso2.carbon.ui.transports.fileupload.ToolsFileUploadExecutor + + + + toolsAny + + org.wso2.carbon.ui.transports.fileupload.ToolsAnyFileUploadExecutor + + + + + + + info + org.wso2.carbon.core.transports.util.InfoProcessor + + + wsdl + org.wso2.carbon.core.transports.util.Wsdl11Processor + + + wsdl2 + org.wso2.carbon.core.transports.util.Wsdl20Processor + + + xsd + org.wso2.carbon.core.transports.util.XsdProcessor + + + + + + false + false + true + svn + http://svnrepo.example.com/repos/ + username + password + true + + + + + + + + + + + + + + + ${require.carbon.servlet} + + + + + true + + + + + + + default repository + ${p2.repo.url} + + + + + + + + true + + + + + + true + + diff --git a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/carbon-home/repository/conf/cdm-config.xml b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/carbon-home/repository/conf/cdm-config.xml new file mode 100644 index 0000000000..b6c2900db7 --- /dev/null +++ b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/carbon-home/repository/conf/cdm-config.xml @@ -0,0 +1,171 @@ + + + + + + + + jdbc/DM_DS + + + + + 1000 + 60000 + 60000 + true + + + io.entgra.device.mgt.core.device.mgt.extensions.push.notification.provider.fcm.FCMBasedPushNotificationProvider + + + io.entgra.device.mgt.core.device.mgt.extensions.push.notification.provider.mqtt.MQTTBasedPushNotificationProvider + + + io.entgra.device.mgt.core.device.mgt.extensions.push.notification.provider.http.HTTPBasedPushNotificationProvider + + + io.entgra.device.mgt.core.device.mgt.extensions.push.notification.provider.xmpp.XMPPBasedPushNotificationProvider + + + + + false + + + https://localhost:9443 + admin + admin + + + https://localhost:9443 + admin + admin + + + org.wso2.carbon.policy.mgt + true + 60000 + 5 + 8 + 20 + + + + Simple + true + + + + 20 + 20 + 20 + 20 + 20 + 20 + 20 + + + + true + + + + false + 600 + + 10000 + + + false + 600 + + 10000 + + + true + + + false + 86400 + + + + + jdbc/DM_ARCHIVAL_DS + + + + false + io.entgra.device.mgt.core.device.mgt.core.task.impl.ArchivalTask + + 0 0 0 1/1 * ? * + + 30 + 1000 + + false + io.entgra.device.mgt.core.device.mgt.core.task.impl.ArchivedDataDeletionTask + + 0 0 3 1/1 * ? * + + 365 + + + + + false + + + false + false + + false + + + + + * + + + + + + true + wss://localhost:9443 + 2 + 100 + 20 + 15 + 640 + + BYOD,COPE + + diff --git a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/carbon-home/repository/conf/datasources/data-source-config.xml b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/carbon-home/repository/conf/datasources/data-source-config.xml new file mode 100644 index 0000000000..a9c81a4710 --- /dev/null +++ b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/carbon-home/repository/conf/datasources/data-source-config.xml @@ -0,0 +1,24 @@ + + + + jdbc:h2:mem:smart-meter-test-db;DB_CLOSE_ON_EXIT=FALSE;MVCC=true + org.h2.Driver + wso2carbon + wso2carbon + diff --git a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/carbon-home/repository/conf/etc/bundle-config/README.txt b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/carbon-home/repository/conf/etc/bundle-config/README.txt new file mode 100644 index 0000000000..ffa7c79264 --- /dev/null +++ b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/carbon-home/repository/conf/etc/bundle-config/README.txt @@ -0,0 +1,12 @@ +This directory supports adding third-pary config files to specific bundles during runtime. + +Explanation: Each OSGi bundle has its own classLoader. Some thirdpary libs read configs from classPath. This scenario fails in OSGi runtime, since OSGi runtime does not share a common classPath for individual bundles. Bundling config files during the bundle creation process itself will solve the issue. However it limits the ability to edit the configs during restarts. + +Here we are providing a workaround for such scenarios. The given config file will get resolved to a fragment bundle and will get attached to the specified host bundle. The host bundle name(symbolic name) is resolved by looking at the directory structure. Hence host bundle name should be directory name of the config file directory. + + +Example: The bundle with symbolic name, 'org.foo.bar' expects a config file named 'foobar.properties' from its classPath. + +create a directory named 'org.foo.bar' inside 'repository/conf/etc/bundle-config' - (this directory) and place the foobar.properties file. + + diff --git a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/carbon-home/repository/conf/etc/carboncontext-osgi-services.properties b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/carbon-home/repository/conf/etc/carboncontext-osgi-services.properties new file mode 100644 index 0000000000..ce110dab3e --- /dev/null +++ b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/carbon-home/repository/conf/etc/carboncontext-osgi-services.properties @@ -0,0 +1,21 @@ +# +# Copyright (c) 2018 - 2023, 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. +# + +#osgi.service.1 = org.wso2.carbon.client.configcontext.provider.Axis2ClientConfigContextProvider +#osgi.service.2 = org.wso2.carbon.user.core.UserManager +#osgi.service.3 = org.wso2.carbon.user.api.UserRealmService \ No newline at end of file diff --git a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/carbon-home/repository/conf/etc/config-validation.xml b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/carbon-home/repository/conf/etc/config-validation.xml new file mode 100644 index 0000000000..930d1d7694 --- /dev/null +++ b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/carbon-home/repository/conf/etc/config-validation.xml @@ -0,0 +1,55 @@ + + + + + + + + 800 + 2047 + 2047 + 1024 + 4096 + 02:FB:AA:5F:20:64:49:4A:27:29:55:71:83:F7:46:CD + + + 256 + 512 + 256 + + + carbon.home + carbon.config.dir.path + axis2.home + + + Linux + Unix + Mac OS + Windows Server 2003 + Windows XP + Windows Vista + Windows 7 + Mac OS X + Windows Server 2008 + Windows Server 2008 R2 + AIX + + + diff --git a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/carbon-home/repository/conf/etc/jmx.xml b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/carbon-home/repository/conf/etc/jmx.xml new file mode 100644 index 0000000000..9da6b6f8cd --- /dev/null +++ b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/carbon-home/repository/conf/etc/jmx.xml @@ -0,0 +1,34 @@ + + + + + true + + + localhost + + + ${Ports.JMX.RMIRegistryPort} + + + ${Ports.JMX.RMIServerPort} + diff --git a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/carbon-home/repository/conf/etc/launch.ini b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/carbon-home/repository/conf/etc/launch.ini new file mode 100644 index 0000000000..8b9f5ad190 --- /dev/null +++ b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/carbon-home/repository/conf/etc/launch.ini @@ -0,0 +1,258 @@ +# Eclipse Runtime Configuration Overrides +# These properties are loaded prior to starting the framework and can also be used to override System Properties +# @null is a special value used to override and clear the framework's copy of a System Property prior to starting the framework +# "*" can be used together with @null to clear System Properties that match a prefix name. + +osgi.*=@null +org.osgi.*=@null +eclipse.*=@null + +osgi.parentClassloader=app +osgi.contextClassLoaderParent=app + +# When osgi.clean is set to "true", any cached data used by the OSGi framework +# will be wiped clean. This will clean the caches used to store bundle +# dependency resolution and eclipse extension registry data. Using this +# option will force OSGi framework to reinitialize these caches. +# The following setting is put in place to get rid of the problems +# faced when re-starting the system. Please note that, when this setting is +# true, if you manually start a bundle, it would not be available when +# you re-start the system. To avid this, copy the bundle jar to the plugins +# folder, before you re-start the system. +osgi.clean=true + +# Uncomment the following line to turn on Eclipse Equinox debugging. +# You may also edit the osgi-debug.options file and fine tune the debugging +# options to suite your needs. +#osgi.debug=./repository/conf/osgi-debug.options + +# Following system property allows us to control the public JDK packages exported through the system bundle. +org.osgi.framework.system.packages=javax.accessibility,\ +javax.activity,\ +javax.crypto,\ +javax.crypto.interfaces,\ +javax.crypto.spec,\ +javax.imageio,\ +javax.imageio.event,\ +javax.imageio.metadata,\ +javax.imageio.plugins.bmp,\ +javax.imageio.plugins.jpeg,\ +javax.imageio.spi,\ +javax.imageio.stream,\ +javax.jms,\ +javax.management,\ +javax.management.loading,\ +javax.management.modelmbean,\ +javax.management.monitor,\ +javax.management.openmbean,\ +javax.management.relation,\ +javax.management.remote,\ +javax.management.remote.rmi,\ +javax.management.timer,\ +javax.naming,\ +javax.naming.directory,\ +javax.naming.event,\ +javax.naming.ldap,\ +javax.naming.spi,\ +javax.net,\ +javax.net.ssl,\ +javax.print,\ +javax.print.attribute,\ +javax.print.attribute.standard,\ +javax.print.event,\ +javax.rmi,\ +javax.rmi.CORBA,\ +javax.rmi.ssl,\ +javax.script,\ +javax.security.auth,\ +javax.security.auth.callback,\ +javax.security.auth.kerberos,\ +javax.security.auth.login,\ +javax.security.auth.spi,\ +javax.security.auth.x500,\ +javax.security.cert,\ +javax.security.sasl,\ +javax.sound.midi,\ +javax.sound.midi.spi,\ +javax.sound.sampled,\ +javax.sound.sampled.spi,\ +javax.sql,\ +javax.sql.rowset,\ +javax.sql.rowset.serial,\ +javax.sql.rowset.spi,\ +javax.swing,\ +javax.swing.border,\ +javax.swing.colorchooser,\ +javax.swing.event,\ +javax.swing.filechooser,\ +javax.swing.plaf,\ +javax.swing.plaf.basic,\ +javax.swing.plaf.metal,\ +javax.swing.plaf.multi,\ +javax.swing.plaf.synth,\ +javax.swing.table,\ +javax.swing.text,\ +javax.swing.text.html,\ +javax.swing.text.html.parser,\ +javax.swing.text.rtf,\ +javax.swing.tree,\ +javax.swing.undo,\ +javax.transaction,\ +javax.transaction.xa,\ +javax.xml.namespace,\ +javax.xml.parsers,\ +javax.xml.stream,\ +javax.xml.stream.events,\ +javax.xml.stream.util,\ +javax.xml.transform,\ +javax.xml.transform.stream,\ +javax.xml.transform.dom,\ +javax.xml.transform.sax,\ +javax.xml,\ +javax.xml.validation,\ +javax.xml.datatype,\ +javax.xml.xpath,\ +javax.activation,\ +com.sun.activation.registries,\ +com.sun.activation.viewers,\ +org.ietf.jgss,\ +org.omg.CORBA,\ +org.omg.CORBA_2_3,\ +org.omg.CORBA_2_3.portable,\ +org.omg.CORBA.DynAnyPackage,\ +org.omg.CORBA.ORBPackage,\ +org.omg.CORBA.portable,\ +org.omg.CORBA.TypeCodePackage,\ +org.omg.CosNaming,\ +org.omg.CosNaming.NamingContextExtPackage,\ +org.omg.CosNaming.NamingContextPackage,\ +org.omg.Dynamic,\ +org.omg.DynamicAny,\ +org.omg.DynamicAny.DynAnyFactoryPackage,\ +org.omg.DynamicAny.DynAnyPackage,\ +org.omg.IOP,\ +org.omg.IOP.CodecFactoryPackage,\ +org.omg.IOP.CodecPackage,\ +org.omg.Messaging,\ +org.omg.PortableInterceptor,\ +org.omg.PortableInterceptor.ORBInitInfoPackage,\ +org.omg.PortableServer,\ +org.omg.PortableServer.CurrentPackage,\ +org.omg.PortableServer.POAManagerPackage,\ +org.omg.PortableServer.POAPackage,\ +org.omg.PortableServer.portable,\ +org.omg.PortableServer.ServantLocatorPackage,\ +org.omg.SendingContext,\ +org.omg.stub.java.rmi,\ +org.w3c.dom,\ +org.w3c.dom.bootstrap,\ +org.w3c.dom.css,\ +org.w3c.dom.events,\ +org.w3c.dom.html,\ +org.w3c.dom.ls,\ +org.w3c.dom.ranges,\ +org.w3c.dom.stylesheets,\ +org.w3c.dom.traversal,\ +org.w3c.dom.views ,\ +org.xml.sax,\ +org.xml.sax.ext,\ +org.xml.sax.helpers,\ +org.apache.xerces.xpointer,\ +org.apache.xerces.xni.grammars,\ +org.apache.xerces.impl.xs.util,\ +org.apache.xerces.jaxp.validation,\ +org.apache.xerces.impl.dtd.models,\ +org.apache.xerces.impl.xpath,\ +org.apache.xerces.dom3.as,\ +org.apache.xerces.impl.dv.xs,\ +org.apache.xerces.util,\ +org.apache.xerces.impl.xs.identity,\ +org.apache.xerces.impl.xs.opti,\ +org.apache.xerces.jaxp,\ +org.apache.xerces.impl.dv,\ +org.apache.xerces.xs.datatypes,\ +org.apache.xerces.dom.events,\ +org.apache.xerces.impl.msg,\ +org.apache.xerces.xni,\ +org.apache.xerces.impl.xs,\ +org.apache.xerces.impl,\ +org.apache.xerces.impl.io,\ +org.apache.xerces.xinclude,\ +org.apache.xerces.jaxp.datatype,\ +org.apache.xerces.parsers,\ +org.apache.xerces.impl.dv.util,\ +org.apache.xerces.xni.parser,\ +org.apache.xerces.impl.xs.traversers,\ +org.apache.xerces.impl.dv.dtd,\ +org.apache.xerces.xs,\ +org.apache.xerces.impl.dtd,\ +org.apache.xerces.impl.validation,\ +org.apache.xerces.impl.xs.models,\ +org.apache.xerces.impl.xpath.regex,\ +org.apache.xml.serialize,\ +org.apache.xerces.dom,\ +org.apache.xalan,\ +org.apache.xalan.xslt,\ +org.apache.xalan.templates,\ +org.apache.xalan.xsltc,\ +org.apache.xalan.xsltc.cmdline,\ +org.apache.xalan.xsltc.cmdline.getopt,\ +org.apache.xalan.xsltc.trax,\ +org.apache.xalan.xsltc.dom,\ +org.apache.xalan.xsltc.runtime,\ +org.apache.xalan.xsltc.runtime.output,\ +org.apache.xalan.xsltc.util,\ +org.apache.xalan.xsltc.compiler,\ +org.apache.xalan.xsltc.compiler.util,\ +org.apache.xalan.serialize,\ +org.apache.xalan.client,\ +org.apache.xalan.res,\ +org.apache.xalan.transformer,\ +org.apache.xalan.extensions,\ +org.apache.xalan.lib,\ +org.apache.xalan.lib.sql,\ +org.apache.xalan.processor,\ +org.apache.xalan.trace,\ +org.apache.xml.dtm,\ +org.apache.xml.dtm.ref,\ +org.apache.xml.dtm.ref.sax2dtm,\ +org.apache.xml.dtm.ref.dom2dtm,\ +org.apache.xml.utils,\ +org.apache.xml.utils.res,\ +org.apache.xml.res,\ +org.apache.xml.serializer,\ +org.apache.xml.serializer.utils,\ +org.apache.xpath,\ +org.apache.xpath.domapi,\ +org.apache.xpath.objects,\ +org.apache.xpath.patterns,\ +org.apache.xpath.jaxp,\ +org.apache.xpath.res,\ +org.apache.xpath.operations,\ +org.apache.xpath.functions,\ +org.apache.xpath.axes,\ +org.apache.xpath.compiler,\ +org.apache.xml.resolver,\ +org.apache.xml.resolver.tools,\ +org.apache.xml.resolver.helpers,\ +org.apache.xml.resolver.readers,\ +org.apache.xml.resolver.etc,\ +org.apache.xml.resolver.apps,\ +javax.xml.ws,\ +javax.xml.ws.handler,\ +javax.xml.ws.handler.soap,\ +javax.xml.ws.http,\ +javax.xml.ws.soap,\ +javax.xml.ws.spi,\ +javax.xml.ws.spi.http,\ +javax.xml.ws.wsaddressing,\ +javax.xml.bind,\ +javax.xml.bind.annotation,\ +javax.xml.bind.annotation.adapters,\ +javax.annotation,\ +javax.jws,\ +javax.jws.soap,\ +com.sun.xml.internal.messaging.saaj.soap.ver1_1,\ +com.sun.xml.internal.messaging.saaj.soap,\ +com.sun.tools.internal.ws.spi,\ +org.wso2.carbon.bootstrap diff --git a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/carbon-home/repository/conf/etc/logging-bridge.properties b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/carbon-home/repository/conf/etc/logging-bridge.properties new file mode 100644 index 0000000000..4d092662c1 --- /dev/null +++ b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/carbon-home/repository/conf/etc/logging-bridge.properties @@ -0,0 +1,72 @@ +# +# Copyright (c) 2018 - 2023, 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. +# + +############################################################ +# Default Logging Configuration File +# +# You can use a different file by specifying a filename +# with the java.util.logging.config.file system property. +# For example java -Djava.util.logging.config.file=myfile +############################################################ +############################################################ +# Global properties +# NOTE: this configuration file use to get the handler list, +# Properties(except level property) define for each handler +# may be not available because LogRecords handover to log4j +# appenders in runtime. +############################################################ +# "handlers" specifies a comma separated list of log Handler +# classes. These handlers will be installed during VM startup. +# Note that these classes must be on the system classpath. +# By default we only configure a ConsoleHandler, which will only +# show messages at the INFO and above levels. +#handlers= java.util.logging.ConsoleHandler +# To also add the FileHandler, use the following line instead. +#handlers= java.util.logging.FileHandler, java.util.logging.ConsoleHandler +# Add org.wso2.carbon.bootstrap.logging.handlers.LogEventHandler to handlers if you need to push java logs to LOGEVENT appender +handlers=org.wso2.carbon.bootstrap.logging.handlers.LoggingConsoleHandler, org.wso2.carbon.bootstrap.logging.handlers.LoggingFileHandler +# Default global logging level. +# This specifies which kinds of events are logged across +# all loggers. For any given facility this global level +# can be overriden by a facility specific level +# Note that the ConsoleHandler also has a separate level +# setting to limit messages printed to the console. +.level=INFO +############################################################ +# Handler specific properties. +# Describes specific configuration info for Handlers. +# +############################################################ +# This FileHandler pushed LogRecords to a log4j FileAppander in runtime +org.wso2.carbon.bootstrap.logging.handlers.LoggingFileHandler.level=INFO +#org.wso2.carbon.bootstrap.logging.handlers.LoggingFileHandler.formatter = java.util.logging.SimpleFormatter +# This ConsoleHandler pushed LogRecords to q log4j ConsoleAppander in runtime +org.wso2.carbon.bootstrap.logging.handlers.LoggingConsoleHandler.level=INFO +#org.wso2.carbon.bootstrap.logging.handlers.LoggingConsoleHandler.formatter = java.util.logging.SimpleFormatter +############################################################ +# Facility specific properties. +# Provides extra control for each logger. +############################################################ +# For example, set the com.xyz.foo logger to only log SEVERE +# messages: +#com.xyz.foo.level = SEVERE +org.apache.coyote.level=SEVERE +org.apache.catalina.level=SEVERE +com.hazelcast.level=SEVERE + + diff --git a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/carbon-home/repository/conf/etc/mime.mappings b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/carbon-home/repository/conf/etc/mime.mappings new file mode 100644 index 0000000000..97a5c5a5fc --- /dev/null +++ b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/carbon-home/repository/conf/etc/mime.mappings @@ -0,0 +1,27 @@ +# +# Copyright 2005-2011 WSO2, Inc. (http://wso2.com) +# +# Licensed 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. +# + +# This file is to define the human readable media type for a mime type. +# Eg:- +# text/plain txt text +application/wsdl+xml WSDL +application/x-xsd+xml Schema +application/policy+xml Policy +application/vnd.wso2-service+xml Service +application/vnd.wso2-hyperlink Hyperlink +application/vnd.wso2.endpoint Endpoint +application/vnd.wso2-api+xml API +application/vnd.wso2-uri+xml URI diff --git a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/carbon-home/repository/conf/etc/mime.types b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/carbon-home/repository/conf/etc/mime.types new file mode 100644 index 0000000000..21c386da00 --- /dev/null +++ b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/carbon-home/repository/conf/etc/mime.types @@ -0,0 +1,734 @@ +# +# Copyright 2005-2009 WSO2, Inc. (http://wso2.com) +# +# Licensed 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. +# + +# Media type for wsdl files. This is not defined in the original mime.types file. +chemical/x-alchemy alc +application/andrew-inset ez +application/wsdl+xml wsdl +application/vnd.sun.wadl+xml wadl +application/activemessage +application/applefile +application/atomicmail +application/batch-SMTP +application/beep+xml +application/cals-1840 +application/commonground +application/cu-seeme cu +application/cybercash +application/dca-rft +application/dec-dx +application/docbook+xml +application/dsptype tsp +application/dvcs +application/edi-consent +application/edi-x12 +application/edifact +application/eshop +application/font-tdpfr +application/futuresplash spl +application/ghostview +application/hta hta +application/http +application/hyperstudio +application/iges +application/index +application/index.cmd +application/index.obj +application/index.response +application/index.vnd +application/iotp +application/ipp +application/isup +application/java-archive jar +application/java-serialized-object ser +application/java-vm class +application/mac-binhex40 hqx +application/mac-compactpro cpt +application/macwriteii +application/marc +application/mathematica nb +application/mathematica-old +application/msaccess mdb +application/msword doc dot +application/news-message-id +application/news-transmission +application/ocsp-request +application/ocsp-response +application/octet-stream bin +application/oda oda +application/ogg ogg +application/parityfec +application/pdf pdf +application/pgp-encrypted +application/pgp-keys key +application/pgp-signature pgp +application/pics-rules prf +application/pkcs10 +application/pkcs7-mime +application/pkcs7-signature +application/pkix-cert +application/pkix-crl +application/pkixcmp +application/policy+xml +application/postscript ps ai eps +application/prs.alvestrand.titrax-sheet +application/prs.cww +application/prs.nprend +application/qsig +application/rar rar +application/rdf+xml rdf +application/remote-printing +application/riscos +application/rss+xml rss +application/rtf +application/sdp +application/set-payment +application/set-payment-initiation +application/set-registration +application/set-registration-initiation +application/sgml +application/sgml-open-catalog +application/sieve +application/slate +application/smil smi smil +application/timestamp-query +application/timestamp-reply +application/vemmi +application/whoispp-query +application/whoispp-response +application/wita +application/wordperfect wpd +application/wordperfect5.1 wp5 +application/x400-bp +application/xhtml+xml xhtml xht +application/xml xml xsl xslt jrxml +application/xml-dtd +application/xml-external-parsed-entity +application/zip zip +application/vnd.3M.Post-it-Notes +application/vnd.accpac.simply.aso +application/vnd.accpac.simply.imp +application/vnd.acucobol +application/vnd.aether.imp +application/vnd.anser-web-certificate-issue-initiation +application/vnd.anser-web-funds-transfer-initiation +application/vnd.audiograph +application/vnd.bmi +application/vnd.businessobjects +application/vnd.canon-cpdl +application/vnd.canon-lips +application/vnd.cinderella cdy +application/vnd.claymore +application/vnd.commerce-battelle +application/vnd.commonspace +application/vnd.comsocaller +application/vnd.contact.cmsg +application/vnd.cosmocaller +application/vnd.ctc-posml +application/vnd.cups-postscript +application/vnd.cups-raster +application/vnd.cups-raw +application/vnd.cybank +application/vnd.dna +application/vnd.dpgraph +application/vnd.dxr +application/vnd.ecdis-update +application/vnd.ecowin.chart +application/vnd.ecowin.filerequest +application/vnd.ecowin.fileupdate +application/vnd.ecowin.series +application/vnd.ecowin.seriesrequest +application/vnd.ecowin.seriesupdate +application/vnd.enliven +application/vnd.epson.esf +application/vnd.epson.msf +application/vnd.epson.quickanime +application/vnd.epson.salt +application/vnd.epson.ssf +application/vnd.ericsson.quickcall +application/vnd.eudora.data +application/vnd.fdf +application/vnd.ffsns +application/vnd.flographit +application/vnd.framemaker +application/vnd.fsc.weblaunch +application/vnd.fujitsu.oasys +application/vnd.fujitsu.oasys2 +application/vnd.fujitsu.oasys3 +application/vnd.fujitsu.oasysgp +application/vnd.fujitsu.oasysprs +application/vnd.fujixerox.ddd +application/vnd.fujixerox.docuworks +application/vnd.fujixerox.docuworks.binder +application/vnd.fut-misnet +application/vnd.grafeq +application/vnd.groove-account +application/vnd.groove-identity-message +application/vnd.groove-injector +application/vnd.groove-tool-message +application/vnd.groove-tool-template +application/vnd.groove-vcard +application/vnd.hhe.lesson-player +application/vnd.hp-HPGL +application/vnd.hp-PCL +application/vnd.hp-PCLXL +application/vnd.hp-hpid +application/vnd.hp-hps +application/vnd.httphone +application/vnd.hzn-3d-crossword +application/vnd.ibm.MiniPay +application/vnd.ibm.afplinedata +application/vnd.ibm.modcap +application/vnd.informix-visionary +application/vnd.intercon.formnet +application/vnd.intertrust.digibox +application/vnd.intertrust.nncp +application/vnd.intu.qbo +application/vnd.intu.qfx +application/vnd.irepository.package+xml +application/vnd.is-xpr +application/vnd.japannet-directory-service +application/vnd.japannet-jpnstore-wakeup +application/vnd.japannet-payment-wakeup +application/vnd.japannet-registration +application/vnd.japannet-registration-wakeup +application/vnd.japannet-setstore-wakeup +application/vnd.japannet-verification +application/vnd.japannet-verification-wakeup +application/vnd.koan +application/vnd.lotus-1-2-3 +application/vnd.lotus-approach +application/vnd.lotus-freelance +application/vnd.lotus-notes +application/vnd.lotus-organizer +application/vnd.lotus-screencam +application/vnd.lotus-wordpro +application/vnd.mcd +application/vnd.mediastation.cdkey +application/vnd.meridian-slingshot +application/vnd.mif +application/vnd.minisoft-hp3000-save +application/vnd.mitsubishi.misty-guard.trustweb +application/vnd.mobius.daf +application/vnd.mobius.dis +application/vnd.mobius.msl +application/vnd.mobius.plc +application/vnd.mobius.txf +application/vnd.motorola.flexsuite +application/vnd.motorola.flexsuite.adsi +application/vnd.motorola.flexsuite.fis +application/vnd.motorola.flexsuite.gotap +application/vnd.motorola.flexsuite.kmr +application/vnd.motorola.flexsuite.ttc +application/vnd.motorola.flexsuite.wem +application/vnd.mozilla.xul+xml xul +application/vnd.ms-artgalry +application/vnd.ms-asf +application/vnd.ms-excel xls xlb xlt +application/vnd.ms-lrm +application/vnd.ms-pki.seccat cat +application/vnd.ms-pki.stl stl +application/vnd.ms-powerpoint ppt pps +application/vnd.ms-project +application/vnd.ms-tnef +application/vnd.ms-works +application/vnd.mseq +application/vnd.msign +application/vnd.music-niff +application/vnd.musician +application/vnd.netfpx +application/vnd.noblenet-directory +application/vnd.noblenet-sealer +application/vnd.noblenet-web +application/vnd.novadigm.EDM +application/vnd.novadigm.EDX +application/vnd.novadigm.EXT +application/vnd.oasis.opendocument.chart odc +application/vnd.oasis.opendocument.database odb +application/vnd.oasis.opendocument.formula odf +application/vnd.oasis.opendocument.graphics odg +application/vnd.oasis.opendocument.graphics-template otg +application/vnd.oasis.opendocument.image odi +application/vnd.oasis.opendocument.presentation odp +application/vnd.oasis.opendocument.presentation-template otp +application/vnd.oasis.opendocument.spreadsheet ods +application/vnd.oasis.opendocument.spreadsheet-template ots +application/vnd.oasis.opendocument.text odt +application/vnd.oasis.opendocument.text-master odm +application/vnd.oasis.opendocument.text-template ott +application/vnd.oasis.opendocument.text-web oth +application/vnd.osa.netdeploy +application/vnd.palm +application/vnd.pg.format +application/vnd.pg.osasli +application/vnd.powerbuilder6 +application/vnd.powerbuilder6-s +application/vnd.powerbuilder7 +application/vnd.powerbuilder7-s +application/vnd.powerbuilder75 +application/vnd.powerbuilder75-s +application/vnd.previewsystems.box +application/vnd.publishare-delta-tree +application/vnd.pvi.ptid1 +application/vnd.pwg-xhtml-print+xml +application/vnd.rapid +application/vnd.rim.cod cod +application/vnd.s3sms +application/vnd.seemail +application/vnd.shana.informed.formdata +application/vnd.shana.informed.formtemplate +application/vnd.shana.informed.interchange +application/vnd.shana.informed.package +application/vnd.smaf mmf +application/vnd.sss-cod +application/vnd.sss-dtf +application/vnd.sss-ntf +application/vnd.stardivision.calc sdc +application/vnd.stardivision.draw sda +application/vnd.stardivision.impress sdd sdp +application/vnd.stardivision.math smf +application/vnd.stardivision.writer sdw vor +application/vnd.stardivision.writer-global sgl +application/vnd.street-stream +application/vnd.sun.xml.calc sxc +application/vnd.sun.xml.calc.template stc +application/vnd.sun.xml.draw sxd +application/vnd.sun.xml.draw.template std +application/vnd.sun.xml.impress sxi +application/vnd.sun.xml.impress.template sti +application/vnd.sun.xml.math sxm +application/vnd.sun.xml.writer sxw +application/vnd.sun.xml.writer.global sxg +application/vnd.sun.xml.writer.template stw +application/vnd.svd +application/vnd.swiftview-ics +application/vnd.symbian.install sis +application/vnd.triscape.mxs +application/vnd.trueapp +application/vnd.truedoc +application/vnd.tve-trigger +application/vnd.ufdl +application/vnd.uplanet.alert +application/vnd.uplanet.alert-wbxml +application/vnd.uplanet.bearer-choice +application/vnd.uplanet.bearer-choice-wbxml +application/vnd.uplanet.cacheop +application/vnd.uplanet.cacheop-wbxml +application/vnd.uplanet.channel +application/vnd.uplanet.channel-wbxml +application/vnd.uplanet.list +application/vnd.uplanet.list-wbxml +application/vnd.uplanet.listcmd +application/vnd.uplanet.listcmd-wbxml +application/vnd.uplanet.signal +application/vnd.vcx +application/vnd.vectorworks +application/vnd.vidsoft.vidconference +application/vnd.visio vsd +application/vnd.vividence.scriptfile +application/vnd.wap.sic +application/vnd.wap.slc +application/vnd.wap.wbxml wbxml +application/vnd.wap.wmlc wmlc +application/vnd.wap.wmlscriptc wmlsc +application/vnd.webturbo +application/vnd.wrq-hp3000-labelled +application/vnd.wso2.bpel+xml bpel +application/vnd.wso2.bpmn+xml bpmn +application/vnd.wso2.endpoint +application/vnd.wso2.governance-archive gar +application/vnd.wso2-hyperlink +application/vnd.wso2.registry-ext-type+xml rxt +application/vnd.wso2-service+xml +application/vnd.wso2.xpdl+xml xpdl +application/vnd.wt.stf +application/vnd.xara +application/vnd.xfdl +application/vnd.yellowriver-custom-menu +application/x-123 wk +application/x-abiword abw +application/x-apple-diskimage dmg +application/x-bcpio bcpio +application/x-bittorrent torrent +application/x-cdf cdf +application/x-cdlink vcd +application/x-chess-pgn pgn +application/x-core +application/x-cpio cpio +application/x-csh csh +application/x-debian-package deb udeb +application/x-director dcr dir dxr +application/x-dms dms +application/x-doom wad +application/x-dvi dvi +application/x-executable +application/x-flac flac +application/x-font pfa pfb gsf pcf pcf.Z +application/x-freemind mm +application/x-futuresplash spl +application/x-gnumeric gnumeric +application/x-go-sgf sgf +application/x-graphing-calculator gcf +application/x-gtar gtar tgz taz +application/x-hdf hdf +application/x-httpd-php phtml pht php +application/x-httpd-php-source phps +application/x-httpd-php3 php3 +application/x-httpd-php3-preprocessed php3p +application/x-httpd-php4 php4 +application/x-httpd-eruby rhtml +application/x-ica ica +application/x-internet-signup ins isp +application/x-iphone iii +application/x-iso9660-image iso +application/x-java-applet +application/x-java-bean +application/x-java-jnlp-file jnlp +application/x-javascript js +application/x-jmol jmz +application/x-kchart chrt +application/x-kdelnk +application/x-killustrator kil +application/x-koan skp skd skt skm +application/x-kpresenter kpr kpt +application/x-kspread ksp +application/x-kword kwd kwt +application/x-latex latex +application/x-lha lha +application/x-lzh lzh +application/x-lzx lzx +application/x-maker frm maker frame fm fb book fbdoc +application/x-mif mif +application/x-ms-wmd wmd +application/x-ms-wmz wmz +application/x-msdos-program com exe bat dll +application/x-msi msi +application/x-netcdf nc +application/x-ns-proxy-autoconfig pac +application/x-nwc nwc +application/x-object o +application/x-oz-application oza +application/x-pkcs7-certreqresp p7r +application/x-pkcs7-crl crl +application/x-python-code pyc pyo +application/x-quicktimeplayer qtl +application/x-redhat-package-manager rpm +application/x-rx +application/x-sh sh +application/x-shar shar +application/x-shellscript +application/x-shockwave-flash swf swfl +application/x-stuffit sit +application/x-sv4cpio sv4cpio +application/x-sv4crc sv4crc +application/x-tar tar +application/x-tcl tcl +application/x-tex-gf gf +application/x-tex-pk pk +application/x-texinfo texinfo texi +application/x-trash ~ % bak old sik +application/x-troff t tr roff +application/x-troff-man man +application/x-troff-me me +application/x-troff-ms ms +application/x-ustar ustar +application/x-videolan +application/x-wais-source src +application/x-wingz wz +application/x-x509-ca-cert crt +application/x-xcf xcf +application/x-xfig fig +application/x-xpinstall xpi +application/x-xsd+xml xsd + +audio/32kadpcm +audio/basic au snd +audio/g.722.1 +audio/l16 +audio/midi mid midi kar +audio/mp4a-latm +audio/mpa-robust +audio/mpeg mpga mpega mp2 mp3 m4a +audio/mpegurl m3u +audio/parityfec +audio/prs.sid sid +audio/telephone-event +audio/tone +audio/vnd.cisco.nse +audio/vnd.cns.anp1 +audio/vnd.cns.inf1 +audio/vnd.digital-winds +audio/vnd.everad.plj +audio/vnd.lucent.voice +audio/vnd.nortel.vbk +audio/vnd.nuera.ecelp4800 +audio/vnd.nuera.ecelp7470 +audio/vnd.nuera.ecelp9600 +audio/vnd.octel.sbc +audio/vnd.qcelp +audio/vnd.rhetorex.32kadpcm +audio/vnd.vmx.cvsd +audio/x-aiff aif aiff aifc +audio/x-gsm gsm +audio/x-mpegurl m3u +audio/x-ms-wma wma +audio/x-ms-wax wax +audio/x-pn-realaudio-plugin +audio/x-pn-realaudio ra rm ram +audio/x-realaudio ra +audio/x-scpls pls +audio/x-sd2 sd2 +audio/x-wav wav + +chemical/x-alchemy alc +chemical/x-cache cac cache +chemical/x-cache-csf csf +chemical/x-cactvs-binary cbin cascii ctab +chemical/x-cdx cdx +chemical/x-cerius cer +chemical/x-chem3d c3d +chemical/x-chemdraw chm +chemical/x-cif cif +chemical/x-cmdf cmdf +chemical/x-cml cml +chemical/x-compass cpa +chemical/x-crossfire bsd +chemical/x-csml csml csm +chemical/x-ctx ctx +chemical/x-cxf cxf cef +#chemical/x-daylight-smiles smi +chemical/x-embl-dl-nucleotide emb embl +chemical/x-galactic-spc spc +chemical/x-gamess-input inp gam gamin +chemical/x-gaussian-checkpoint fch fchk +chemical/x-gaussian-cube cub +chemical/x-gaussian-input gau gjc gjf +chemical/x-gaussian-log gal +chemical/x-gcg8-sequence gcg +chemical/x-genbank gen +chemical/x-hin hin +chemical/x-isostar istr ist +chemical/x-jcamp-dx jdx dx +chemical/x-kinemage kin +chemical/x-macmolecule mcm +chemical/x-macromodel-input mmd mmod +chemical/x-mdl-molfile mol +chemical/x-mdl-rdfile rd +chemical/x-mdl-rxnfile rxn +chemical/x-mdl-sdfile sd sdf +chemical/x-mdl-tgf tgf +#chemical/x-mif mif +chemical/x-mmcif mcif +chemical/x-mol2 mol2 +chemical/x-molconn-Z b +chemical/x-mopac-graph gpt +chemical/x-mopac-input mop mopcrt mpc dat zmt +chemical/x-mopac-out moo +chemical/x-mopac-vib mvb +chemical/x-ncbi-asn1 asn +chemical/x-ncbi-asn1-ascii prt ent +chemical/x-ncbi-asn1-binary val aso +chemical/x-ncbi-asn1-spec asn +chemical/x-pdb pdb ent +chemical/x-rosdal ros +chemical/x-swissprot sw +chemical/x-vamas-iso14976 vms +chemical/x-vmd vmd +chemical/x-xtel xtel +chemical/x-xyz xyz + +image/cgm +image/g3fax +image/gif gif +image/ief ief +image/jpeg jpeg jpg jpe +image/naplps +image/pcx pcx +image/png png +image/prs.btif +image/prs.pti +image/svg+xml svg svgz +image/tiff tiff tif +image/vnd.cns.inf2 +image/vnd.djvu djvu djv +image/vnd.dwg +image/vnd.dxf +image/vnd.fastbidsheet +image/vnd.fpx +image/vnd.fst +image/vnd.fujixerox.edmics-mmr +image/vnd.fujixerox.edmics-rlc +image/vnd.mix +image/vnd.net-fpx +image/vnd.svf +image/vnd.wap.wbmp wbmp +image/vnd.xiff +image/x-cmu-raster ras +image/x-coreldraw cdr +image/x-coreldrawpattern pat +image/x-coreldrawtemplate cdt +image/x-corelphotopaint cpt +image/x-icon ico +image/x-jg art +image/x-jng jng +image/x-ms-bmp bmp +image/x-photoshop psd +image/x-portable-anymap pnm +image/x-portable-bitmap pbm +image/x-portable-graymap pgm +image/x-portable-pixmap ppm +image/x-rgb rgb +image/x-xbitmap xbm +image/x-xpixmap xpm +image/x-xwindowdump xwd + +inode/chardevice +inode/blockdevice +inode/directory-locked +inode/directory +inode/fifo +inode/socket + +message/delivery-status +message/disposition-notification +message/external-body +message/http +message/s-http +message/news +message/partial +message/rfc822 + +model/iges igs iges +model/mesh msh mesh silo +model/vnd.dwf +model/vnd.flatland.3dml +model/vnd.gdl +model/vnd.gs-gdl +model/vnd.gtw +model/vnd.mts +model/vnd.vtu +model/vrml wrl vrml + +multipart/alternative +multipart/appledouble +multipart/byteranges +multipart/digest +multipart/encrypted +multipart/form-data +multipart/header-set +multipart/mixed +multipart/parallel +multipart/related +multipart/report +multipart/signed +multipart/voice-message + +text/calendar ics icz +text/comma-separated-values csv +text/css css +text/directory +text/english +text/enriched +text/h323 323 +text/html html htm shtml +text/iuls uls +text/mathml mml +text/parityfec +text/plain asc txt text diff pot sql +text/prs.lines.tag +text/rfc822-headers +text/richtext rtx +text/rtf rtf +text/scriptlet sct wsc +text/t140 +text/texmacs tm ts +text/tab-separated-values tsv +text/uri-list +text/vnd.abc +text/vnd.curl +text/vnd.DMClientScript +text/vnd.flatland.3dml +text/vnd.fly +text/vnd.fmi.flexstor +text/vnd.in3d.3dml +text/vnd.in3d.spot +text/vnd.IPTC.NewsML +text/vnd.IPTC.NITF +text/vnd.latex-z +text/vnd.motorola.reflex +text/vnd.ms-mediapackage +text/vnd.sun.j2me.app-descriptor jad +text/vnd.wap.si +text/vnd.wap.sl +text/vnd.wap.wml wml +text/vnd.wap.wmlscript wmls +text/x-bibtex bib +text/x-boo boo +text/x-c++hdr h++ hpp hxx hh +text/x-c++src c++ cpp cxx cc +text/x-chdr h +text/x-component htc +text/x-crontab +text/x-csh csh +text/x-csrc c +text/x-dsrc d +text/x-haskell hs +text/x-java java +text/x-literate-haskell lhs +text/x-makefile +text/x-moc moc +text/x-pascal p pas +text/x-pcs-gcd gcd +text/x-perl pl pm +text/x-python py +text/x-server-parsed-html +text/x-setext etx +text/x-sh sh +text/x-tcl tcl tk +text/x-tex tex ltx sty cls +text/x-vcalendar vcs +text/x-vcard vcf + +video/dl dl +video/dv dif dv +video/fli fli +video/gl gl +video/mpeg mpeg mpg mpe +video/mp4 mp4 +video/quicktime qt mov +video/mp4v-es +video/parityfec +video/pointer +video/vnd.fvt +video/vnd.motorola.video +video/vnd.motorola.videop +video/vnd.mpegurl mxu +video/vnd.mts +video/vnd.nokia.interleaved-multimedia +video/vnd.vivo +video/x-la-asf lsf lsx +video/x-mng mng +video/x-ms-asf asf asx +video/x-ms-wm wm +video/x-ms-wmv wmv +video/x-ms-wmx wmx +video/x-ms-wvx wvx +video/x-msvideo avi +video/x-sgi-movie movie + +x-conference/x-cooltalk ice + +x-world/x-vrml vrm vrml wrl diff --git a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/carbon-home/repository/conf/etc/osgi-debug.options b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/carbon-home/repository/conf/etc/osgi-debug.options new file mode 100644 index 0000000000..32ffd87393 --- /dev/null +++ b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/carbon-home/repository/conf/etc/osgi-debug.options @@ -0,0 +1,95 @@ +#### Debugging options for org.eclipse.osgi + +# Turn on general debugging for org.eclipse.osgi +org.eclipse.osgi/debug=true +# Prints out class loading debug information +org.eclipse.osgi/debug/loader=false +# Prints out event (FrameworkEvent/BundleEvent/ServiceEvent) and listener debug information +org.eclipse.osgi/debug/events=false +# Prints out OSGi service debug information (registration/getting/ungetting etc.) +org.eclipse.osgi/debug/services=false +# Prints out bundle manifest parsing debug information +org.eclipse.osgi/debug/manifest=false +# Prints out LDAP filter debug information +org.eclipse.osgi/debug/filter=false +# Prints out security (PermissionAdmin service) debug information +org.eclipse.osgi/debug/security=false +# Prints out start level service debug information +org.eclipse.osgi/debug/startlevel=true +# Prints out package admin service debug information +org.eclipse.osgi/debug/packageadmin=false +# Prints out timing information for bundle activation +org.eclipse.osgi/debug/bundleTime=false +# Debug the loading of message bundles +org.eclipse.osgi/debug/messageBundles=false + +# Eclipse adaptor options +org.eclipse.osgi/eclipseadaptor/debug = false +org.eclipse.osgi/eclipseadaptor/debug/location = false +org.eclipse.osgi/eclipseadaptor/debug/platformadmin=false +org.eclipse.osgi/eclipseadaptor/debug/platformadmin/resolver=false +org.eclipse.osgi/eclipseadaptor/converter/debug = false + +### OSGi resolver options +# Turns on debugging for the resolver +org.eclipse.osgi/resolver/debug = false +# Prints out wiring information after the resolver has completed the resolve process +org.eclipse.osgi/resolver/wiring = false +# Prints out Import-Package information +org.eclipse.osgi/resolver/imports = false +# Prints out Require-Bundle information +org.eclipse.osgi/resolver/requires = false +# Prints out package grouping information form the "uses" clause +org.eclipse.osgi/resolver/grouping = false +# Prints out cycle information +org.eclipse.osgi/resolver/cycles = false +# Prints out Eclipse-GenericRequire information +org.eclipse.osgi/resolver/generics = false + +#### Profile settings +org.eclipse.osgi/profile/startup = false +org.eclipse.osgi/profile/benchmark = false +org.eclipse.osgi/profile/debug = true + +# Override the default implemenation +org.eclipse.osgi/profile/impl = org.eclipse.osgi.internal.profile.DefaultProfileLogger + +# Append all profile messages to the filename specified +org.eclipse.osgi/defaultprofile/logfilename = + +# Output all profile log messages synchronously to the jvm console. +# By default, all log messages are cached until the log buffer is +# requested. +org.eclipse.osgi/defaultprofile/logsynchronously = false + +# Specify the size of the default profile implementation log buffer. +org.eclipse.osgi/defaultprofile/buffersize = 256 + +#### Monitoring settings +# monitor class loading +org.eclipse.osgi/monitor/classes=false + +# monitor bundle activation +org.eclipse.osgi/monitor/activation=false + +# monitor resource bundle (*.properties) loading +org.eclipse.osgi/monitor/resources=false + + +#### Trace settings +# trace class loading - snapshot the execution stack when a class is loaded +org.eclipse.osgi/trace/classLoading=false + +# trace location - file in which execution traces are written +org.eclipse.osgi/trace/filename=runtime.traces + +# trace filters - Java properties file defining which classes should +# be traced (if trace/classLoading is true) +# File format: +# plugins= +# packages= +# Note that there may be many 'plugins' and 'packages' lines in one file. +org.eclipse.osgi/trace/filters=trace.properties + +# trace bundle activation - snapshot the execution stack when a bundle is activated +org.eclipse.osgi/trace/activation=false diff --git a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/carbon-home/repository/conf/etc/tasks-config.xml b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/carbon-home/repository/conf/etc/tasks-config.xml new file mode 100644 index 0000000000..042a4a5b34 --- /dev/null +++ b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/carbon-home/repository/conf/etc/tasks-config.xml @@ -0,0 +1,69 @@ + + + + + + STANDALONE + + + 2 + + + + org.wso2.carbon.ntask.core.impl.RoundRobinTaskLocationResolver + + + + + + + https://localhost:9448 + + + https://localhost:9443 + + + admin + + + admin + + + + + diff --git a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/carbon-home/repository/conf/log4j.properties b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/carbon-home/repository/conf/log4j.properties new file mode 100644 index 0000000000..5c3417378e --- /dev/null +++ b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/carbon-home/repository/conf/log4j.properties @@ -0,0 +1,32 @@ +# +# Copyright (c) 2018 - 2023, 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. +# +log4j.rootLogger=DEBUG, console, Default +#Automation file appender +log4j.appender.Default=org.apache.log4j.RollingFileAppender +log4j.appender.Default.File=target/logs/automation.log +log4j.appender.Default.Append=true +log4j.appender.Default.MaxFileSize=10MB +log4j.appender.Default.MaxBackupIndex=10 +log4j.appender.Default.layout=org.apache.log4j.PatternLayout +log4j.appender.Default.layout.ConversionPattern=%d{ISO8601} %-5p [%c] [%t] - %m%n +#Automation console appender +log4j.appender.console=org.apache.log4j.ConsoleAppender +log4j.appender.console.Target=System.out +log4j.appender.console.layout=org.apache.log4j.PatternLayout +log4j.appender.console.layout.ConversionPattern=%d{ISO8601} %-5p [%c] [%t] - %m%n +log4j.logger.io.entgra=TRACE \ No newline at end of file diff --git a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/carbon-home/repository/conf/registry.xml b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/carbon-home/repository/conf/registry.xml new file mode 100644 index 0000000000..8eaa9ff2d5 --- /dev/null +++ b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/carbon-home/repository/conf/registry.xml @@ -0,0 +1,108 @@ + + + + + + + + wso2registry + false + true + / + + + jdbc:h2:./target/databasetest/CARBON_TEST + + org.h2.Driver + 80 + 60000 + 5 + + + + + + + + + + + + false + + + + true + true + true + true + + diff --git a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/carbon-home/repository/conf/security/authenticators.xml b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/carbon-home/repository/conf/security/authenticators.xml new file mode 100644 index 0000000000..e4f6608d87 --- /dev/null +++ b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/carbon-home/repository/conf/security/authenticators.xml @@ -0,0 +1,75 @@ + + + + + + + + + + 5 + + + + + 10 + + /carbon/admin/login.jsp + carbonServer + https://localhost:9443/samlsso + urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified + + + + + + + + + + + + + + + + + + + + + + + diff --git a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/carbon-home/repository/conf/tomcat/carbon/META-INF/context.xml b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/carbon-home/repository/conf/tomcat/carbon/META-INF/context.xml new file mode 100644 index 0000000000..fbedf52653 --- /dev/null +++ b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/carbon-home/repository/conf/tomcat/carbon/META-INF/context.xml @@ -0,0 +1,35 @@ + + + + + + + WEB-INF/web.xml + + + + + + + + + + diff --git a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/carbon-home/repository/conf/tomcat/carbon/WEB-INF/web.xml b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/carbon-home/repository/conf/tomcat/carbon/WEB-INF/web.xml new file mode 100644 index 0000000000..ce7e79bbe1 --- /dev/null +++ b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/carbon-home/repository/conf/tomcat/carbon/WEB-INF/web.xml @@ -0,0 +1,61 @@ + + + + + + + bridgeservlet + Carbon Bridge Servlet + Carbon Bridge Servlet + org.wso2.carbon.tomcat.ext.servlet.DelegationServlet + + 1 + + + bridgeservlet + /* + + + + bridgeservlet + *.jsp + + + + + CharsetFilter + org.wso2.carbon.tomcat.ext.filter.CharacterSetFilter + + requestEncoding + UTF-8 + + + + + CharsetFilter + /* + + + + 15 + + diff --git a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/carbon-home/repository/conf/tomcat/catalina-server.xml b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/carbon-home/repository/conf/tomcat/catalina-server.xml new file mode 100644 index 0000000000..a1fcc2363c --- /dev/null +++ b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/carbon-home/repository/conf/tomcat/catalina-server.xml @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/carbon-home/repository/conf/tomcat/tomcat-users.xml b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/carbon-home/repository/conf/tomcat/tomcat-users.xml new file mode 100644 index 0000000000..bdf4ec4481 --- /dev/null +++ b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/carbon-home/repository/conf/tomcat/tomcat-users.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/carbon-home/repository/conf/tomcat/web.xml b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/carbon-home/repository/conf/tomcat/web.xml new file mode 100644 index 0000000000..95814d86e5 --- /dev/null +++ b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/carbon-home/repository/conf/tomcat/web.xml @@ -0,0 +1,1222 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + default + org.apache.catalina.servlets.DefaultServlet + + debug + 0 + + + sendfileSize + -1 + + + listings + false + + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + jsp + org.apache.jasper.servlet.JspServlet + + fork + false + + + xpoweredBy + false + + 3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + jsp + *.jsp + + + + jsp + *.jspx + + + + default + / + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 30 + + + + + + + + + + + + abs + audio/x-mpeg + + + ai + application/postscript + + + aif + audio/x-aiff + + + aifc + audio/x-aiff + + + aiff + audio/x-aiff + + + aim + application/x-aim + + + art + image/x-jg + + + asf + video/x-ms-asf + + + asx + video/x-ms-asf + + + au + audio/basic + + + avi + video/x-msvideo + + + avx + video/x-rad-screenplay + + + bcpio + application/x-bcpio + + + bin + application/octet-stream + + + bmp + image/bmp + + + body + text/html + + + cdf + application/x-cdf + + + cer + application/x-x509-ca-cert + + + class + application/java + + + cpio + application/x-cpio + + + csh + application/x-csh + + + css + text/css + + + dib + image/bmp + + + doc + application/msword + + + dtd + application/xml-dtd + + + dv + video/x-dv + + + dvi + application/x-dvi + + + eps + application/postscript + + + etx + text/x-setext + + + exe + application/octet-stream + + + gif + image/gif + + + gtar + application/x-gtar + + + gz + application/x-gzip + + + hdf + application/x-hdf + + + hqx + application/mac-binhex40 + + + htc + text/x-component + + + htm + text/html + + + html + text/html + + + ief + image/ief + + + jad + text/vnd.sun.j2me.app-descriptor + + + jar + application/java-archive + + + java + text/plain + + + jnlp + application/x-java-jnlp-file + + + jpe + image/jpeg + + + jpeg + image/jpeg + + + jpg + image/jpeg + + + js + application/javascript + + + jsf + text/plain + + + jspf + text/plain + + + kar + audio/x-midi + + + latex + application/x-latex + + + m3u + audio/x-mpegurl + + + mac + image/x-macpaint + + + man + application/x-troff-man + + + mathml + application/mathml+xml + + + me + application/x-troff-me + + + mid + audio/x-midi + + + midi + audio/x-midi + + + mif + application/x-mif + + + mov + video/quicktime + + + movie + video/x-sgi-movie + + + mp1 + audio/x-mpeg + + + mp2 + audio/x-mpeg + + + mp3 + audio/x-mpeg + + + mp4 + video/mp4 + + + mpa + audio/x-mpeg + + + mpe + video/mpeg + + + mpeg + video/mpeg + + + mpega + audio/x-mpeg + + + mpg + video/mpeg + + + mpv2 + video/mpeg2 + + + ms + application/x-wais-source + + + nc + application/x-netcdf + + + oda + application/oda + + + + odb + application/vnd.oasis.opendocument.database + + + + odc + application/vnd.oasis.opendocument.chart + + + + odf + application/vnd.oasis.opendocument.formula + + + + odg + application/vnd.oasis.opendocument.graphics + + + + odi + application/vnd.oasis.opendocument.image + + + + odm + application/vnd.oasis.opendocument.text-master + + + + odp + application/vnd.oasis.opendocument.presentation + + + + ods + application/vnd.oasis.opendocument.spreadsheet + + + + odt + application/vnd.oasis.opendocument.text + + + + otg + application/vnd.oasis.opendocument.graphics-template + + + + oth + application/vnd.oasis.opendocument.text-web + + + + otp + application/vnd.oasis.opendocument.presentation-template + + + + ots + application/vnd.oasis.opendocument.spreadsheet-template + + + + ott + application/vnd.oasis.opendocument.text-template + + + + ogx + application/ogg + + + ogv + video/ogg + + + oga + audio/ogg + + + ogg + audio/ogg + + + spx + audio/ogg + + + flac + audio/flac + + + anx + application/annodex + + + axa + audio/annodex + + + axv + video/annodex + + + xspf + application/xspf+xml + + + pbm + image/x-portable-bitmap + + + pct + image/pict + + + pdf + application/pdf + + + pgm + image/x-portable-graymap + + + pic + image/pict + + + pict + image/pict + + + pls + audio/x-scpls + + + png + image/png + + + pnm + image/x-portable-anymap + + + pnt + image/x-macpaint + + + ppm + image/x-portable-pixmap + + + ppt + application/vnd.ms-powerpoint + + + pps + application/vnd.ms-powerpoint + + + ps + application/postscript + + + psd + image/x-photoshop + + + qt + video/quicktime + + + qti + image/x-quicktime + + + qtif + image/x-quicktime + + + ras + image/x-cmu-raster + + + rdf + application/rdf+xml + + + rgb + image/x-rgb + + + rm + application/vnd.rn-realmedia + + + roff + application/x-troff + + + rtf + application/rtf + + + rtx + text/richtext + + + sh + application/x-sh + + + shar + application/x-shar + + + + smf + audio/x-midi + + + sit + application/x-stuffit + + + snd + audio/basic + + + src + application/x-wais-source + + + sv4cpio + application/x-sv4cpio + + + sv4crc + application/x-sv4crc + + + svg + image/svg+xml + + + svgz + image/svg+xml + + + swf + application/x-shockwave-flash + + + t + application/x-troff + + + tar + application/x-tar + + + tcl + application/x-tcl + + + tex + application/x-tex + + + texi + application/x-texinfo + + + texinfo + application/x-texinfo + + + tif + image/tiff + + + tiff + image/tiff + + + tr + application/x-troff + + + tsv + text/tab-separated-values + + + txt + text/plain + + + ulw + audio/basic + + + ustar + application/x-ustar + + + vxml + application/voicexml+xml + + + xbm + image/x-xbitmap + + + xht + application/xhtml+xml + + + xhtml + application/xhtml+xml + + + xls + application/vnd.ms-excel + + + xml + application/xml + + + xpm + image/x-xpixmap + + + xsl + application/xml + + + xslt + application/xslt+xml + + + xul + application/vnd.mozilla.xul+xml + + + xwd + image/x-xwindowdump + + + vsd + application/x-visio + + + wav + audio/x-wav + + + + wbmp + image/vnd.wap.wbmp + + + + wml + text/vnd.wap.wml + + + + wmlc + application/vnd.wap.wmlc + + + + wmls + text/vnd.wap.wmlscript + + + + wmlscriptc + application/vnd.wap.wmlscriptc + + + wmv + video/x-ms-wmv + + + wrl + x-world/x-vrml + + + wspolicy + application/wspolicy+xml + + + Z + application/x-compress + + + z + application/x-compress + + + zip + application/zip + + + + + + + + + + + + + + + + + + index.html + index.htm + index.jsp + + + \ No newline at end of file diff --git a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/carbon-home/repository/conf/user-mgt.xml b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/carbon-home/repository/conf/user-mgt.xml new file mode 100644 index 0000000000..c0acc78420 --- /dev/null +++ b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/carbon-home/repository/conf/user-mgt.xml @@ -0,0 +1,382 @@ + + + + + + true + admin + + admin + admin + + everyone + jdbc/WSO2CarbonDB + + + + + + + org.wso2.carbon.user.core.tenant.JDBCTenantManager + false + 100 + false + default + SHA-256 + true + true + true + false + ^[\S]{5,30}$ + Password length should be between 5 to 30 characters + + ^[\S]{5,30}$ + [a-zA-Z0-9._-|//]{3,30}$ + ^[\S]{3,30}$ + ^[^~!#$;%^*+={}\\|\\\\<>,\'\"]{3,30}$ + ^[\S]{3,30}$ + true + 100 + 100 + false + false + true + , + true + + + + + + + + + + + + + + + + + + + /permission + true + true + + + + + diff --git a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/config/datasource/data-source-config-mock.xml b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/config/datasource/data-source-config-mock.xml new file mode 100644 index 0000000000..383fc72b75 --- /dev/null +++ b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/config/datasource/data-source-config-mock.xml @@ -0,0 +1,33 @@ + + + + + jdbc:h2:mem:cdm-test-db;DB_CLOSE_ON_EXIT=FALSE;MVCC=true + io.entgra.device.mgt.core.device.mgt.extensions.device.organization.mock.MockJDBCDriver + wso2carbon + wso2carbon + + + + + + + + + diff --git a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/config/datasource/data-source-config-no-table.xml b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/config/datasource/data-source-config-no-table.xml new file mode 100644 index 0000000000..b28626efe7 --- /dev/null +++ b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/config/datasource/data-source-config-no-table.xml @@ -0,0 +1,33 @@ + + + + + jdbc:h2:mem:nodb-test-db;DB_CLOSE_ON_EXIT=FALSE;MVCC=true + org.h2.Driver + wso2carbon + wso2carbon + + + + + + + + + diff --git a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/config/datasource/data-source-config.xml b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/config/datasource/data-source-config.xml new file mode 100644 index 0000000000..27b6dfeaeb --- /dev/null +++ b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/config/datasource/data-source-config.xml @@ -0,0 +1,33 @@ + + + + + jdbc:h2:mem:cdm-test-db;DB_CLOSE_ON_EXIT=FALSE;MVCC=true + org.h2.Driver + wso2carbon + wso2carbon + + + + + + + + + diff --git a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/config/datasource/mssql/data-source-config-mock.xml b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/config/datasource/mssql/data-source-config-mock.xml new file mode 100644 index 0000000000..0e06bc7db2 --- /dev/null +++ b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/config/datasource/mssql/data-source-config-mock.xml @@ -0,0 +1,33 @@ + + + + + jdbc:sqlserver://localhost:1433;databaseName=AdventureWorks + io.entgra.device.mgt.core.device.mgt.extensions.device.organization.mock.MockJDBCDriver + wso2carbon + wso2carbon + + + + + + + + + diff --git a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/config/datasource/mssql/data-source-config-no-table.xml b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/config/datasource/mssql/data-source-config-no-table.xml new file mode 100644 index 0000000000..0e06bc7db2 --- /dev/null +++ b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/config/datasource/mssql/data-source-config-no-table.xml @@ -0,0 +1,33 @@ + + + + + jdbc:sqlserver://localhost:1433;databaseName=AdventureWorks + io.entgra.device.mgt.core.device.mgt.extensions.device.organization.mock.MockJDBCDriver + wso2carbon + wso2carbon + + + + + + + + + diff --git a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/config/datasource/mssql/data-source-config.xml b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/config/datasource/mssql/data-source-config.xml new file mode 100644 index 0000000000..0e06bc7db2 --- /dev/null +++ b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/config/datasource/mssql/data-source-config.xml @@ -0,0 +1,33 @@ + + + + + jdbc:sqlserver://localhost:1433;databaseName=AdventureWorks + io.entgra.device.mgt.core.device.mgt.extensions.device.organization.mock.MockJDBCDriver + wso2carbon + wso2carbon + + + + + + + + + diff --git a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/config/datasource/mysql/data-source-config-mock.xml b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/config/datasource/mysql/data-source-config-mock.xml new file mode 100644 index 0000000000..8c3ab9b184 --- /dev/null +++ b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/config/datasource/mysql/data-source-config-mock.xml @@ -0,0 +1,33 @@ + + + + + jdbc:mysql://localhost/test + io.entgra.device.mgt.core.device.mgt.extensions.device.organization.mock.MockJDBCDriver + wso2carbon + wso2carbon + + + + + + + + + diff --git a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/config/datasource/mysql/data-source-config-no-table.xml b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/config/datasource/mysql/data-source-config-no-table.xml new file mode 100644 index 0000000000..9b91611f2b --- /dev/null +++ b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/config/datasource/mysql/data-source-config-no-table.xml @@ -0,0 +1,33 @@ + + + + + jdbc:mysql://localhost/noTableTest + io.entgra.device.mgt.core.device.mgt.extensions.device.organization.mock.MockJDBCDriver + wso2carbon + wso2carbon + + + + + + + + + diff --git a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/config/datasource/mysql/data-source-config.xml b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/config/datasource/mysql/data-source-config.xml new file mode 100644 index 0000000000..8c3ab9b184 --- /dev/null +++ b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/config/datasource/mysql/data-source-config.xml @@ -0,0 +1,33 @@ + + + + + jdbc:mysql://localhost/test + io.entgra.device.mgt.core.device.mgt.extensions.device.organization.mock.MockJDBCDriver + wso2carbon + wso2carbon + + + + + + + + + diff --git a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/config/datasource/oracle/data-source-config-mock.xml b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/config/datasource/oracle/data-source-config-mock.xml new file mode 100644 index 0000000000..83fcf60898 --- /dev/null +++ b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/config/datasource/oracle/data-source-config-mock.xml @@ -0,0 +1,33 @@ + + + + + jdbc:oracle:thin:@myhost:1521:orcl + io.entgra.device.mgt.core.device.mgt.extensions.device.organization.mock.MockJDBCDriver + wso2carbon + wso2carbon + + + + + + + + + diff --git a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/config/datasource/oracle/data-source-config-no-table.xml b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/config/datasource/oracle/data-source-config-no-table.xml new file mode 100644 index 0000000000..b0ea09b576 --- /dev/null +++ b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/config/datasource/oracle/data-source-config-no-table.xml @@ -0,0 +1,33 @@ + + + + + jdbc:oracle:thin:@myhost:1521:orclt + io.entgra.device.mgt.core.device.mgt.extensions.device.organization.mock.MockJDBCDriver + wso2carbon + wso2carbon + + + + + + + + + diff --git a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/config/datasource/oracle/data-source-config.xml b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/config/datasource/oracle/data-source-config.xml new file mode 100644 index 0000000000..83fcf60898 --- /dev/null +++ b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/config/datasource/oracle/data-source-config.xml @@ -0,0 +1,33 @@ + + + + + jdbc:oracle:thin:@myhost:1521:orcl + io.entgra.device.mgt.core.device.mgt.extensions.device.organization.mock.MockJDBCDriver + wso2carbon + wso2carbon + + + + + + + + + diff --git a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/config/datasource/postgre/data-source-config-mock.xml b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/config/datasource/postgre/data-source-config-mock.xml new file mode 100644 index 0000000000..8c3ab9b184 --- /dev/null +++ b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/config/datasource/postgre/data-source-config-mock.xml @@ -0,0 +1,33 @@ + + + + + jdbc:mysql://localhost/test + io.entgra.device.mgt.core.device.mgt.extensions.device.organization.mock.MockJDBCDriver + wso2carbon + wso2carbon + + + + + + + + + diff --git a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/config/datasource/postgre/data-source-config-no-table.xml b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/config/datasource/postgre/data-source-config-no-table.xml new file mode 100644 index 0000000000..9b91611f2b --- /dev/null +++ b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/config/datasource/postgre/data-source-config-no-table.xml @@ -0,0 +1,33 @@ + + + + + jdbc:mysql://localhost/noTableTest + io.entgra.device.mgt.core.device.mgt.extensions.device.organization.mock.MockJDBCDriver + wso2carbon + wso2carbon + + + + + + + + + diff --git a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/config/datasource/postgre/data-source-config.xml b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/config/datasource/postgre/data-source-config.xml new file mode 100644 index 0000000000..71cd504a08 --- /dev/null +++ b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/config/datasource/postgre/data-source-config.xml @@ -0,0 +1,33 @@ + + + + + jdbc:postgresql://localhost/test + io.entgra.device.mgt.core.device.mgt.extensions.device.organization.mock.MockJDBCDriver + wso2carbon + wso2carbon + + + + + + + + + diff --git a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/config/malformed-app-management-config-no-client-key-secret.xml b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/config/malformed-app-management-config-no-client-key-secret.xml new file mode 100644 index 0000000000..0f44fb04c3 --- /dev/null +++ b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/config/malformed-app-management-config-no-client-key-secret.xml @@ -0,0 +1,23 @@ + + + + + true + http:/www.google.com + diff --git a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/config/malformed-app-management-config-no-enabled.xml b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/config/malformed-app-management-config-no-enabled.xml new file mode 100644 index 0000000000..2a310d361c --- /dev/null +++ b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/config/malformed-app-management-config-no-enabled.xml @@ -0,0 +1,24 @@ + + + + + http:/www.google.com + ConsumerKey + ConsumerSecret + diff --git a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/config/malformed-cdm-config-no-ds-config.xml b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/config/malformed-cdm-config-no-ds-config.xml new file mode 100644 index 0000000000..abb9bce254 --- /dev/null +++ b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/config/malformed-cdm-config-no-ds-config.xml @@ -0,0 +1,29 @@ + + + + + + + + jdbc/DEVICE_MGT_DS + + + + + diff --git a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/config/malformed-cdm-config-no-jndi-config.xml b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/config/malformed-cdm-config-no-jndi-config.xml new file mode 100644 index 0000000000..32d874196c --- /dev/null +++ b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/config/malformed-cdm-config-no-jndi-config.xml @@ -0,0 +1,29 @@ + + + + + + + + jdbc/DEVICE_MGT_DS + + + + + diff --git a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/config/malformed-cdm-config-no-mgt-repo.xml b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/config/malformed-cdm-config-no-mgt-repo.xml new file mode 100644 index 0000000000..93e1f3add3 --- /dev/null +++ b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/config/malformed-cdm-config-no-mgt-repo.xml @@ -0,0 +1,29 @@ + + + + + + + + jdbc/DEVICE_MGT_DS + + + + + diff --git a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/config/operation/cdm-config.xml b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/config/operation/cdm-config.xml new file mode 100644 index 0000000000..32295cbd63 --- /dev/null +++ b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/config/operation/cdm-config.xml @@ -0,0 +1,152 @@ + + + + + + + + jdbc/DM_DS + + + + + 2 + 2000 + 2000 + true + + io.entgra.device.mgt.core.device.mgt.extensions.push.notification.provider.fcm.FCMBasedPushNotificationProvider + io.entgra.device.mgt.core.device.mgt.extensions.push.notification.provider.mqtt.MQTTBasedPushNotificationProvider + io.entgra.device.mgt.core.device.mgt.extensions.push.notification.provider.http.HTTPBasedPushNotificationProvider + io.entgra.device.mgt.core.device.mgt.extensions.push.notification.provider.xmpp.XMPPBasedPushNotificationProvider + + + + false + + + https://localhost:9443 + admin + admin + + + https://localhost:9443 + admin + admin + + + org.wso2.carbon.policy.mgt + true + 60000 + 5 + 8 + 20 + + + + Simple + true + + + + 20 + 20 + 20 + 20 + 20 + 20 + 20 + + + + true + + + + false + 600 + + 10000 + + + false + 86400 + + + + + jdbc/DM_ARCHIVAL_DS + + + + false + io.entgra.device.mgt.core.device.mgt.core.task.impl.ArchivalTask + + 0 0 0 1/1 * ? * + + 30 + 1000 + + false + io.entgra.device.mgt.core.device.mgt.core.task.impl.ArchivedDataDeletionTask + + 0 0 3 1/1 * ? * + + 365 + + + + + false + + + false + false + + false + + + + + * + + + + + + true + wss://localhost:9443 + 2 + 100 + 20 + 15 + 640 + + BYOD,COPE + + diff --git a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/config/operation/traccar-config.xml b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/config/operation/traccar-config.xml new file mode 100644 index 0000000000..86f62d8207 --- /dev/null +++ b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/config/operation/traccar-config.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + sample + http://localhost: + 4385 + 8085 + Authorization + Basic YWRtaW46YWRtaW4= + + + + diff --git a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/config/schema/app-mgt-config-schema.xsd b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/config/schema/app-mgt-config-schema.xsd new file mode 100644 index 0000000000..7182bb601c --- /dev/null +++ b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/config/schema/app-mgt-config-schema.xsd @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/config/schema/device-mgt-config-schema.xsd b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/config/schema/device-mgt-config-schema.xsd new file mode 100644 index 0000000000..74867e4e9e --- /dev/null +++ b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/config/schema/device-mgt-config-schema.xsd @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/log4j.properties b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/log4j.properties new file mode 100644 index 0000000000..df1082ea3f --- /dev/null +++ b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/log4j.properties @@ -0,0 +1,34 @@ +# +# Copyright (c) 2018 - 2023, 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. +# + +# +# This is the log4j configuration file used by WSO2 Carbon +# +# IMPORTANT : Please do not remove or change the names of any +# of the Appender defined here. The layout pattern & log file +# can be changed using the WSO2 Carbon Management Console, and those +# settings will override the settings in this file. +# + +log4j.rootLogger=DEBUG, STD_OUT + +# Redirect log messages to console +log4j.appender.STD_OUT=org.apache.log4j.ConsoleAppender +log4j.appender.STD_OUT.Target=System.out +log4j.appender.STD_OUT.layout=org.apache.log4j.PatternLayout +log4j.appender.STD_OUT.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n diff --git a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/mysql-testng.xml b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/mysql-testng.xml new file mode 100644 index 0000000000..dc2e735fd9 --- /dev/null +++ b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/mysql-testng.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/sql/h2.sql b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/sql/h2.sql new file mode 100644 index 0000000000..b4d2bde228 --- /dev/null +++ b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/sql/h2.sql @@ -0,0 +1,672 @@ +CREATE TABLE IF NOT EXISTS DM_DEVICE_TYPE ( + ID INT AUTO_INCREMENT NOT NULL, + NAME VARCHAR(300) NULL DEFAULT NULL, + DEVICE_TYPE_META VARCHAR(20000) NULL DEFAULT NULL, + LAST_UPDATED_TIMESTAMP TIMESTAMP NOT NULL, + PROVIDER_TENANT_ID INTEGER DEFAULT 0, + SHARED_WITH_ALL_TENANTS BOOLEAN NOT NULL DEFAULT FALSE, + PRIMARY KEY (ID) +); + +CREATE TABLE IF NOT EXISTS DM_GROUP ( + ID INTEGER AUTO_INCREMENT NOT NULL, + GROUP_NAME VARCHAR(100) DEFAULT NULL, + STATUS VARCHAR(50) DEFAULT NULL, + DESCRIPTION TEXT DEFAULT NULL, + OWNER VARCHAR(45) DEFAULT NULL, + PARENT_PATH VARCHAR(255) DEFAULT NULL, + TENANT_ID INTEGER DEFAULT 0, + PARENT_GROUP_ID INTEGER DEFAULT 0, + PRIMARY KEY (ID) +); + +CREATE TABLE IF NOT EXISTS DM_ROLE_GROUP_MAP ( + ID INTEGER AUTO_INCREMENT NOT NULL, + GROUP_ID INTEGER DEFAULT NULL, + ROLE VARCHAR(45) DEFAULT NULL, + TENANT_ID INTEGER DEFAULT 0, + PRIMARY KEY (ID), + CONSTRAINT fk_DM_ROLE_GROUP_MAP_DM_GROUP2 FOREIGN KEY (GROUP_ID) + REFERENCES DM_GROUP (ID) ON DELETE CASCADE ON UPDATE CASCADE +); + +CREATE TABLE IF NOT EXISTS DM_DEVICE ( + ID INTEGER auto_increment NOT NULL, + DESCRIPTION TEXT DEFAULT NULL, + NAME VARCHAR(100) DEFAULT NULL, + DEVICE_TYPE_ID INT(11) DEFAULT NULL, + DEVICE_IDENTIFICATION VARCHAR(300) DEFAULT NULL, + LAST_UPDATED_TIMESTAMP TIMESTAMP NOT NULL, + TENANT_ID INTEGER DEFAULT 0, + PRIMARY KEY (ID), + CONSTRAINT fk_DM_DEVICE_DM_DEVICE_TYPE2 FOREIGN KEY (DEVICE_TYPE_ID) + REFERENCES DM_DEVICE_TYPE (ID) ON DELETE NO ACTION ON UPDATE NO ACTION, + CONSTRAINT uk_DM_DEVICE UNIQUE (NAME, DEVICE_TYPE_ID, DEVICE_IDENTIFICATION, TENANT_ID) +); + +CREATE TABLE IF NOT EXISTS DM_DEVICE_PROPERTIES ( + DEVICE_TYPE_NAME VARCHAR(300) NOT NULL, + DEVICE_IDENTIFICATION VARCHAR(300) NOT NULL, + PROPERTY_NAME VARCHAR(100) DEFAULT 0, + PROPERTY_VALUE VARCHAR(100) DEFAULT NULL, + TENANT_ID VARCHAR(100), + PRIMARY KEY (DEVICE_TYPE_NAME, DEVICE_IDENTIFICATION, PROPERTY_NAME, TENANT_ID) +); + +CREATE TABLE IF NOT EXISTS GROUP_PROPERTIES ( + GROUP_ID INTEGER NOT NULL, + PROPERTY_NAME VARCHAR(100) DEFAULT 0, + PROPERTY_VALUE VARCHAR(100) DEFAULT NULL, + TENANT_ID VARCHAR(100), + PRIMARY KEY (GROUP_ID, PROPERTY_NAME, TENANT_ID) +); + +CREATE TABLE IF NOT EXISTS DM_DEVICE_GROUP_MAP ( + ID INTEGER AUTO_INCREMENT NOT NULL, + DEVICE_ID INTEGER DEFAULT NULL, + GROUP_ID INTEGER DEFAULT NULL, + TENANT_ID INTEGER DEFAULT 0, + PRIMARY KEY (ID), + CONSTRAINT fk_DM_DEVICE_GROUP_MAP_DM_DEVICE2 FOREIGN KEY (DEVICE_ID) + REFERENCES DM_DEVICE (ID) ON DELETE CASCADE ON UPDATE CASCADE, + CONSTRAINT fk_DM_DEVICE_GROUP_MAP_DM_GROUP2 FOREIGN KEY (GROUP_ID) + REFERENCES DM_GROUP (ID) ON DELETE CASCADE ON UPDATE CASCADE +); + +-- DM_GEOFENCE TABLE-- +CREATE TABLE IF NOT EXISTS DM_GEOFENCE +( + ID INT NOT NULL AUTO_INCREMENT, + FENCE_NAME VARCHAR(255) NOT NULL, + DESCRIPTION TEXT DEFAULT NULL, + LATITUDE DOUBLE DEFAULT NULL, + LONGITUDE DOUBLE DEFAULT NULL, + RADIUS DOUBLE DEFAULT NULL, + GEO_JSON TEXT DEFAULT NULL, + FENCE_SHAPE VARCHAR(100) DEFAULT NULL, + CREATED_TIMESTAMP TIMESTAMP NOT NULL, + OWNER VARCHAR(255) NOT NULL, + TENANT_ID INTEGER DEFAULT 0, + PRIMARY KEY (ID) +); +-- END OF DM_GEOFENCE TABLE-- + +-- DM_GEOFENCE_GROUP_MAPPING TABLE-- +CREATE TABLE IF NOT EXISTS DM_GEOFENCE_GROUP_MAPPING +( + ID INT NOT NULL AUTO_INCREMENT, + FENCE_ID INT NOT NULL, + GROUP_ID INT NOT NULL, + PRIMARY KEY (ID), + CONSTRAINT fk_dm_geofence_group_mapping_geofence FOREIGN KEY (FENCE_ID) REFERENCES + DM_GEOFENCE (ID) ON DELETE NO ACTION ON UPDATE NO ACTION, + CONSTRAINT fk_dm_geofence_group_mapping_group FOREIGN KEY (GROUP_ID) REFERENCES + DM_GROUP (ID) ON DELETE NO ACTION ON UPDATE NO ACTION +); +-- END OF DM_GEOFENCE_GROUP_MAPPING TABLE-- + +-- DM_DEVICE_EVENT TABLE -- +CREATE TABLE IF NOT EXISTS DM_DEVICE_EVENT +( + ID INT NOT NULL AUTO_INCREMENT, + EVENT_SOURCE VARCHAR(100) NOT NULL, + EVENT_LOGIC VARCHAR(100) NOT NULL, + ACTIONS TEXT DEFAULT NULL, + CREATED_TIMESTAMP TIMESTAMP NOT NULL, + TENANT_ID INTEGER DEFAULT 0, + PRIMARY KEY (ID) +); +-- END OF DM_DEVICE_EVENT TABLE -- + +-- DM_DEVICE_EVENT_GROUP_MAPPING TABLE-- +CREATE TABLE IF NOT EXISTS DM_DEVICE_EVENT_GROUP_MAPPING +( + ID INT NOT NULL AUTO_INCREMENT, + EVENT_ID INT NOT NULL, + GROUP_ID INT NOT NULL, + PRIMARY KEY (ID), + CONSTRAINT fk_dm_event_group_mapping_event FOREIGN KEY (EVENT_ID) REFERENCES + DM_DEVICE_EVENT (ID) ON DELETE NO ACTION ON UPDATE NO ACTION, + CONSTRAINT fk_dm_event_group_mapping_group FOREIGN KEY (GROUP_ID) REFERENCES + DM_GROUP (ID) ON DELETE NO ACTION ON UPDATE NO ACTION +); +-- END OF DM_DEVICE_EVENT_GROUP_MAPPING TABLE-- + +CREATE TABLE IF NOT EXISTS DM_OPERATION ( + ID INTEGER AUTO_INCREMENT NOT NULL, + TYPE VARCHAR(50) NOT NULL, + CREATED_TIMESTAMP BIGINT NOT NULL, + RECEIVED_TIMESTAMP BIGINT NULL, + OPERATION_CODE VARCHAR(1000) NOT NULL, + INITIATED_BY VARCHAR(100) NULL, + OPERATION_DETAILS BLOB DEFAULT NULL, + ENABLED BOOLEAN NOT NULL DEFAULT FALSE, + TENANT_ID INTEGER NOT NULL, + PRIMARY KEY (ID) +); + +CREATE TABLE IF NOT EXISTS DM_ENROLMENT ( + ID INTEGER AUTO_INCREMENT NOT NULL, + DEVICE_ID INTEGER NOT NULL, + OWNER VARCHAR(50) NOT NULL, + OWNERSHIP VARCHAR(45) DEFAULT NULL, + STATUS VARCHAR(50) NULL, + IS_TRANSFERRED BOOLEAN NOT NULL DEFAULT FALSE, + DATE_OF_ENROLMENT TIMESTAMP DEFAULT NULL, + DATE_OF_LAST_UPDATE TIMESTAMP DEFAULT NULL, + TENANT_ID INT NOT NULL, + PRIMARY KEY (ID), + CONSTRAINT fk_dm_device_enrolment FOREIGN KEY (DEVICE_ID) REFERENCES + DM_DEVICE (ID) ON DELETE NO ACTION ON UPDATE NO ACTION, + CONSTRAINT uk_dm_device_enrolment UNIQUE (DEVICE_ID, OWNER, OWNERSHIP, TENANT_ID) +); +CREATE TABLE IF NOT EXISTS DM_DEVICE_STATUS ( + ID INTEGER AUTO_INCREMENT NOT NULL, + ENROLMENT_ID INTEGER NOT NULL, + DEVICE_ID INTEGER NOT NULL, + STATUS VARCHAR(50) DEFAULT NULL, + UPDATE_TIME TIMESTAMP DEFAULT NULL, + CHANGED_BY VARCHAR(255) NOT NULL, + PRIMARY KEY (ID), + CONSTRAINT fk_dm_device_status_device FOREIGN KEY (DEVICE_ID) REFERENCES + DM_DEVICE (ID) ON DELETE NO ACTION ON UPDATE NO ACTION, + CONSTRAINT fk_dm_device_status_enrolment FOREIGN KEY (ENROLMENT_ID) REFERENCES + DM_ENROLMENT (ID) ON DELETE NO ACTION ON UPDATE NO ACTION +); +CREATE TABLE IF NOT EXISTS DM_ENROLMENT_OP_MAPPING ( + ID INTEGER AUTO_INCREMENT NOT NULL, + ENROLMENT_ID INTEGER NOT NULL, + OPERATION_ID INTEGER NOT NULL, + STATUS VARCHAR(50) NULL, + PUSH_NOTIFICATION_STATUS VARCHAR(50) NULL, + CREATED_TIMESTAMP INT NOT NULL, + UPDATED_TIMESTAMP INT NOT NULL, + OPERATION_CODE VARCHAR(50) NOT NULL, + INITIATED_BY VARCHAR(100) NULL, + TYPE VARCHAR(20) NOT NULL, + DEVICE_ID INTEGER DEFAULT NULL, + DEVICE_TYPE VARCHAR(300) NOT NULL, + DEVICE_IDENTIFICATION VARCHAR(300) DEFAULT NULL, + TENANT_ID INTEGER DEFAULT 0, + PRIMARY KEY (ID), + CONSTRAINT fk_dm_device_operation_mapping_device FOREIGN KEY (ENROLMENT_ID) REFERENCES + DM_ENROLMENT (ID) ON DELETE NO ACTION ON UPDATE NO ACTION, + CONSTRAINT fk_dm_device_operation_mapping_operation FOREIGN KEY (OPERATION_ID) REFERENCES + DM_OPERATION (ID) ON DELETE NO ACTION ON UPDATE NO ACTION +); + +CREATE TABLE IF NOT EXISTS DM_DEVICE_OPERATION_RESPONSE ( + ID INTEGER AUTO_INCREMENT NOT NULL, + ENROLMENT_ID INTEGER NOT NULL, + OPERATION_ID INTEGER NOT NULL, + EN_OP_MAP_ID INTEGER NOT NULL, + OPERATION_RESPONSE VARCHAR(1024) DEFAULT NULL , + IS_LARGE_RESPONSE BOOLEAN NOT NULL DEFAULT FALSE, + RECEIVED_TIMESTAMP TIMESTAMP NULL, + PRIMARY KEY (ID), + CONSTRAINT fk_dm_device_operation_response_enrollment FOREIGN KEY (ENROLMENT_ID) REFERENCES + DM_ENROLMENT (ID) ON DELETE NO ACTION ON UPDATE NO ACTION, + CONSTRAINT fk_dm_device_operation_response_operation FOREIGN KEY (OPERATION_ID) REFERENCES + DM_OPERATION (ID) ON DELETE NO ACTION ON UPDATE NO ACTION, + CONSTRAINT fk_dm_en_op_map_response FOREIGN KEY (EN_OP_MAP_ID) REFERENCES + DM_ENROLMENT_OP_MAPPING (ID) ON DELETE NO ACTION ON UPDATE NO ACTION +); + +CREATE TABLE DM_DEVICE_OPERATION_RESPONSE_LARGE ( + ID INTEGER NOT NULL, + OPERATION_RESPONSE LONGBLOB DEFAULT NULL, + OPERATION_ID INTEGER NOT NULL, + EN_OP_MAP_ID INTEGER NOT NULL, + RECEIVED_TIMESTAMP TIMESTAMP NULL, + DEVICE_IDENTIFICATION VARCHAR(300) DEFAULT NULL, + CONSTRAINT fk_dm_device_operation_response_large_mapping FOREIGN KEY (ID) + REFERENCES DM_DEVICE_OPERATION_RESPONSE (ID) + ON DELETE NO ACTION ON UPDATE NO ACTION, + CONSTRAINT fk_dm_en_op_map_response_large FOREIGN KEY (EN_OP_MAP_ID) + REFERENCES DM_ENROLMENT_OP_MAPPING (ID) + ON DELETE NO ACTION ON UPDATE NO ACTION +); + +-- POLICY RELATED TABLES -- + +CREATE TABLE IF NOT EXISTS DM_PROFILE ( + ID INT NOT NULL AUTO_INCREMENT , + PROFILE_NAME VARCHAR(45) NOT NULL , + TENANT_ID INT NOT NULL , + DEVICE_TYPE VARCHAR(300) NOT NULL , + CREATED_TIME DATETIME NOT NULL , + UPDATED_TIME DATETIME NOT NULL , + PRIMARY KEY (ID) +); + +CREATE TABLE IF NOT EXISTS DM_POLICY ( + ID INT(11) NOT NULL AUTO_INCREMENT , + NAME VARCHAR(45) DEFAULT NULL , + DESCRIPTION VARCHAR(1000) NULL, + TENANT_ID INT(11) NOT NULL , + PROFILE_ID INT(11) NOT NULL , + OWNERSHIP_TYPE VARCHAR(45) NULL, + COMPLIANCE VARCHAR(100) NULL, + PRIORITY INT NOT NULL, + ACTIVE INT(2) NOT NULL, + UPDATED INT(1) NULL, + PRIMARY KEY (ID) , + CONSTRAINT FK_DM_PROFILE_DM_POLICY + FOREIGN KEY (PROFILE_ID ) + REFERENCES DM_PROFILE (ID ) + ON DELETE NO ACTION + ON UPDATE NO ACTION +); + +CREATE TABLE IF NOT EXISTS DM_DEVICE_POLICY ( + ID INT(11) NOT NULL AUTO_INCREMENT , + DEVICE_ID INT(11) NOT NULL , + ENROLMENT_ID INT(11) NOT NULL, + DEVICE BLOB NOT NULL, + POLICY_ID INT(11) NOT NULL , + PRIMARY KEY (ID) , + CONSTRAINT FK_POLICY_DEVICE_POLICY + FOREIGN KEY (POLICY_ID ) + REFERENCES DM_POLICY (ID ) + ON DELETE NO ACTION + ON UPDATE NO ACTION, + CONSTRAINT FK_DEVICE_DEVICE_POLICY + FOREIGN KEY (DEVICE_ID ) + REFERENCES DM_DEVICE (ID ) + ON DELETE NO ACTION + ON UPDATE NO ACTION +); + +CREATE TABLE IF NOT EXISTS DM_DEVICE_TYPE_POLICY ( + ID INT(11) NOT NULL , + DEVICE_TYPE VARCHAR(300) NOT NULL , + POLICY_ID INT(11) NOT NULL , + PRIMARY KEY (ID) , + CONSTRAINT FK_DEVICE_TYPE_POLICY + FOREIGN KEY (POLICY_ID ) + REFERENCES DM_POLICY (ID ) + ON DELETE NO ACTION + ON UPDATE NO ACTION +); + +CREATE TABLE IF NOT EXISTS DM_PROFILE_FEATURES ( + ID INT(11) NOT NULL AUTO_INCREMENT, + PROFILE_ID INT(11) NOT NULL, + FEATURE_CODE VARCHAR(100) NOT NULL, + DEVICE_TYPE VARCHAR(300) NOT NULL, + TENANT_ID INT(11) NOT NULL , + CONTENT BLOB NULL DEFAULT NULL, + PRIMARY KEY (ID), + CONSTRAINT FK_DM_PROFILE_DM_POLICY_FEATURES + FOREIGN KEY (PROFILE_ID) + REFERENCES DM_PROFILE (ID) + ON DELETE NO ACTION + ON UPDATE NO ACTION +); + +CREATE TABLE IF NOT EXISTS DM_ROLE_POLICY ( + ID INT(11) NOT NULL AUTO_INCREMENT , + ROLE_NAME VARCHAR(45) NOT NULL , + POLICY_ID INT(11) NOT NULL , + PRIMARY KEY (ID) , + CONSTRAINT FK_ROLE_POLICY_POLICY + FOREIGN KEY (POLICY_ID ) + REFERENCES DM_POLICY (ID ) + ON DELETE NO ACTION + ON UPDATE NO ACTION +); + +CREATE TABLE IF NOT EXISTS DM_USER_POLICY ( + ID INT NOT NULL AUTO_INCREMENT , + POLICY_ID INT NOT NULL , + USERNAME VARCHAR(45) NOT NULL , + PRIMARY KEY (ID) , + CONSTRAINT DM_POLICY_USER_POLICY + FOREIGN KEY (POLICY_ID ) + REFERENCES DM_POLICY (ID ) + ON DELETE NO ACTION + ON UPDATE NO ACTION +); + +CREATE TABLE IF NOT EXISTS DM_DEVICE_POLICY_APPLIED ( + ID INT NOT NULL AUTO_INCREMENT , + DEVICE_ID INT NOT NULL , + ENROLMENT_ID INT(11) NOT NULL, + POLICY_ID INT NOT NULL , + POLICY_CONTENT BLOB NULL , + TENANT_ID INT NOT NULL, + APPLIED TINYINT(1) NULL , + CREATED_TIME TIMESTAMP NULL , + UPDATED_TIME TIMESTAMP NULL , + APPLIED_TIME TIMESTAMP NULL , + PRIMARY KEY (ID) , + CONSTRAINT FK_DM_POLICY_DEVCIE_APPLIED + FOREIGN KEY (DEVICE_ID ) + REFERENCES DM_DEVICE (ID ) + ON DELETE NO ACTION + ON UPDATE NO ACTION +); + +CREATE TABLE IF NOT EXISTS DM_CRITERIA ( + ID INT NOT NULL AUTO_INCREMENT, + TENANT_ID INT NOT NULL, + NAME VARCHAR(50) NULL, + PRIMARY KEY (ID) +); + +CREATE TABLE IF NOT EXISTS DM_POLICY_CRITERIA ( + ID INT NOT NULL AUTO_INCREMENT, + CRITERIA_ID INT NOT NULL, + POLICY_ID INT NOT NULL, + PRIMARY KEY (ID), + CONSTRAINT FK_CRITERIA_POLICY_CRITERIA + FOREIGN KEY (CRITERIA_ID) + REFERENCES DM_CRITERIA (ID) + ON DELETE NO ACTION + ON UPDATE NO ACTION, + CONSTRAINT FK_POLICY_POLICY_CRITERIA + FOREIGN KEY (POLICY_ID) + REFERENCES DM_POLICY (ID) + ON DELETE NO ACTION + ON UPDATE NO ACTION +); + +CREATE TABLE IF NOT EXISTS DM_POLICY_CRITERIA_PROPERTIES ( + ID INT NOT NULL AUTO_INCREMENT, + POLICY_CRITERION_ID INT NOT NULL, + PROP_KEY VARCHAR(45) NULL, + PROP_VALUE VARCHAR(100) NULL, + CONTENT BLOB NULL, + PRIMARY KEY (ID), + CONSTRAINT FK_POLICY_CRITERIA_PROPERTIES + FOREIGN KEY (POLICY_CRITERION_ID) + REFERENCES DM_POLICY_CRITERIA (ID) + ON DELETE CASCADE + ON UPDATE NO ACTION +); + +CREATE TABLE IF NOT EXISTS DM_POLICY_COMPLIANCE_STATUS ( + ID INT NOT NULL AUTO_INCREMENT, + DEVICE_ID INT NOT NULL, + ENROLMENT_ID INT(11) NOT NULL, + POLICY_ID INT NOT NULL, + TENANT_ID INT NOT NULL, + STATUS INT NULL, + LAST_SUCCESS_TIME TIMESTAMP NULL, + LAST_REQUESTED_TIME TIMESTAMP NULL, + LAST_FAILED_TIME TIMESTAMP NULL, + ATTEMPTS INT NULL, + PRIMARY KEY (ID) +); + +CREATE TABLE IF NOT EXISTS DM_POLICY_CHANGE_MGT ( + ID INT NOT NULL AUTO_INCREMENT, + POLICY_ID INT NOT NULL, + DEVICE_TYPE VARCHAR(300) NOT NULL , + TENANT_ID INT(11) NOT NULL, + PRIMARY KEY (ID) +); + +CREATE TABLE IF NOT EXISTS DM_POLICY_COMPLIANCE_FEATURES ( + ID INT NOT NULL AUTO_INCREMENT, + COMPLIANCE_STATUS_ID INT NOT NULL, + TENANT_ID INT NOT NULL, + FEATURE_CODE VARCHAR(100) NOT NULL, + STATUS INT NULL, + PRIMARY KEY (ID), + CONSTRAINT FK_COMPLIANCE_FEATURES_STATUS + FOREIGN KEY (COMPLIANCE_STATUS_ID) + REFERENCES DM_POLICY_COMPLIANCE_STATUS (ID) + ON DELETE NO ACTION + ON UPDATE NO ACTION +); + +CREATE TABLE IF NOT EXISTS DM_APPLICATION ( + ID INTEGER AUTO_INCREMENT NOT NULL, + NAME VARCHAR(150) NOT NULL, + APP_IDENTIFIER VARCHAR(150) NOT NULL, + PLATFORM VARCHAR(50) DEFAULT NULL, + CATEGORY VARCHAR(50) NULL, + VERSION VARCHAR(50) NULL, + TYPE VARCHAR(50) NULL, + LOCATION_URL VARCHAR(100) DEFAULT NULL, + IMAGE_URL VARCHAR(100) DEFAULT NULL, + APP_PROPERTIES BLOB NULL, + MEMORY_USAGE INTEGER(10) NULL, + IS_ACTIVE BOOLEAN NOT NULL DEFAULT FALSE, + DEVICE_ID INTEGER NOT NULL, + ENROLMENT_ID INTEGER NOT NULL, + TENANT_ID INTEGER NOT NULL, + PRIMARY KEY (ID), + CONSTRAINT fk_dm_device + FOREIGN KEY (DEVICE_ID) + REFERENCES DM_DEVICE (ID) + ON DELETE NO ACTION + ON UPDATE NO ACTION, + CONSTRAINT FK_DM_APP_MAP_DM_ENROL + FOREIGN KEY (ENROLMENT_ID) + REFERENCES DM_ENROLMENT (ID) + ON DELETE NO ACTION + ON UPDATE NO ACTION +); + +-- POLICY RELATED TABLES FINISHED -- + +-- NOTIFICATION TABLE -- +CREATE TABLE IF NOT EXISTS DM_NOTIFICATION ( + NOTIFICATION_ID INTEGER AUTO_INCREMENT NOT NULL, + DEVICE_ID INTEGER NOT NULL, + OPERATION_ID INTEGER NULL, + TENANT_ID INTEGER NOT NULL, + STATUS VARCHAR(10) NULL, + DESCRIPTION VARCHAR(1000) NULL, + LAST_UPDATED_TIMESTAMP TIMESTAMP NOT NULL, + PRIMARY KEY (NOTIFICATION_ID), + CONSTRAINT fk_dm_device_notification FOREIGN KEY (DEVICE_ID) REFERENCES + DM_DEVICE (ID) ON DELETE NO ACTION ON UPDATE NO ACTION +); +-- NOTIFICATION TABLE END -- + +CREATE TABLE IF NOT EXISTS DM_DEVICE_INFO ( + ID INTEGER AUTO_INCREMENT NOT NULL, + DEVICE_ID INT NULL, + ENROLMENT_ID INT NOT NULL, + KEY_FIELD VARCHAR(45) NULL, + VALUE_FIELD VARCHAR(1500) NULL, + PRIMARY KEY (ID), + CONSTRAINT DM_DEVICE_INFO_DEVICE + FOREIGN KEY (DEVICE_ID) + REFERENCES DM_DEVICE (ID) + ON DELETE NO ACTION + ON UPDATE NO ACTION, + CONSTRAINT DM_DEVICE_INFO_DEVICE_ENROLLMENT + FOREIGN KEY (ENROLMENT_ID) + REFERENCES DM_ENROLMENT (ID) + ON DELETE NO ACTION + ON UPDATE NO ACTION +); + +CREATE TABLE IF NOT EXISTS DM_DEVICE_LOCATION ( + ID INTEGER AUTO_INCREMENT NOT NULL, + DEVICE_ID INT NULL, + ENROLMENT_ID INT NOT NULL, + LATITUDE DOUBLE NULL, + LONGITUDE DOUBLE NULL, + STREET1 VARCHAR(255) NULL, + STREET2 VARCHAR(45) NULL, + CITY VARCHAR(45) NULL, + ZIP VARCHAR(10) NULL, + STATE VARCHAR(45) NULL, + COUNTRY VARCHAR(45) NULL, + GEO_HASH VARCHAR(45) NULL, + UPDATE_TIMESTAMP BIGINT(15) NOT NULL, + PRIMARY KEY (ID), + CONSTRAINT DM_DEVICE_LOCATION_DEVICE + FOREIGN KEY (DEVICE_ID) + REFERENCES DM_DEVICE (ID) + ON DELETE NO ACTION + ON UPDATE NO ACTION, + CONSTRAINT DM_DEVICE_LOCATION_DM_ENROLLMENT + FOREIGN KEY (ENROLMENT_ID) + REFERENCES DM_ENROLMENT (ID) + ON DELETE NO ACTION + ON UPDATE NO ACTION +); +CREATE INDEX DM_DEVICE_LOCATION_GEO_hashx ON DM_DEVICE_LOCATION(GEO_HASH ASC); + +CREATE TABLE IF NOT EXISTS DM_DEVICE_DETAIL ( + ID INT NOT NULL AUTO_INCREMENT, + DEVICE_ID INT NOT NULL, + ENROLMENT_ID INT NOT NULL, + DEVICE_MODEL VARCHAR(45) NULL, + VENDOR VARCHAR(45) NULL, + OS_VERSION VARCHAR(45) NULL, + OS_BUILD_DATE VARCHAR(100) NULL, + BATTERY_LEVEL DECIMAL(4) NULL, + INTERNAL_TOTAL_MEMORY DECIMAL(30,3) NULL, + INTERNAL_AVAILABLE_MEMORY DECIMAL(30,3) NULL, + EXTERNAL_TOTAL_MEMORY DECIMAL(30,3) NULL, + EXTERNAL_AVAILABLE_MEMORY DECIMAL(30,3) NULL, + CONNECTION_TYPE VARCHAR(50) NULL, + SSID VARCHAR(45) NULL, + CPU_USAGE DECIMAL(5) NULL, + TOTAL_RAM_MEMORY DECIMAL(30,3) NULL, + AVAILABLE_RAM_MEMORY DECIMAL(30,3) NULL, + PLUGGED_IN INT(1) NULL, + UPDATE_TIMESTAMP BIGINT(15) NOT NULL, + PRIMARY KEY (ID), + CONSTRAINT FK_DM_DEVICE_DETAILS_DEVICE + FOREIGN KEY (DEVICE_ID) + REFERENCES DM_DEVICE (ID) + ON DELETE NO ACTION + ON UPDATE NO ACTION, + CONSTRAINT FK_DM_ENROLMENT_DEVICE_DETAILS + FOREIGN KEY (ENROLMENT_ID) + REFERENCES DM_ENROLMENT (ID) + ON DELETE NO ACTION + ON UPDATE NO ACTION +); + +/* + * Copyright (c) 2018 - 2023, 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. + */ + +-- POLICY AND DEVICE GROUP MAPPING -- +CREATE TABLE IF NOT EXISTS DM_DEVICE_GROUP_POLICY ( + ID INT NOT NULL AUTO_INCREMENT, + DEVICE_GROUP_ID INT NOT NULL, + POLICY_ID INT NOT NULL, + TENANT_ID INT NOT NULL, + PRIMARY KEY (ID), + CONSTRAINT FK_DM_DEVICE_GROUP_POLICY + FOREIGN KEY (DEVICE_GROUP_ID) + REFERENCES DM_GROUP (ID) + ON DELETE CASCADE + ON UPDATE CASCADE , + CONSTRAINT FK_DM_DEVICE_GROUP_DM_POLICY + FOREIGN KEY (POLICY_ID) + REFERENCES DM_POLICY (ID) + ON DELETE CASCADE + ON UPDATE CASCADE +); +-- END OF POLICY AND DEVICE GROUP MAPPING -- + +-- DASHBOARD RELATED VIEWS -- +CREATE VIEW POLICY_COMPLIANCE_INFO AS +SELECT +DEVICE_INFO.DEVICE_ID, +DEVICE_INFO.DEVICE_IDENTIFICATION, +DEVICE_INFO.PLATFORM, +DEVICE_INFO.OWNERSHIP, +DEVICE_INFO.CONNECTIVITY_STATUS, +IFNULL(DEVICE_WITH_POLICY_INFO.POLICY_ID, -1) AS POLICY_ID, +IFNULL(DEVICE_WITH_POLICY_INFO.IS_COMPLIANT, -1) AS IS_COMPLIANT, +DEVICE_INFO.TENANT_ID +FROM +(SELECT +DM_DEVICE.ID AS DEVICE_ID, +DM_DEVICE.DEVICE_IDENTIFICATION, +DM_DEVICE_TYPE.NAME AS PLATFORM, +DM_ENROLMENT.OWNERSHIP, +DM_ENROLMENT.STATUS AS CONNECTIVITY_STATUS, +DM_DEVICE.TENANT_ID +FROM DM_DEVICE, DM_DEVICE_TYPE, DM_ENROLMENT +WHERE DM_DEVICE.DEVICE_TYPE_ID = DM_DEVICE_TYPE.ID AND DM_DEVICE.ID = DM_ENROLMENT.DEVICE_ID) DEVICE_INFO +LEFT JOIN +(SELECT +DEVICE_ID, +POLICY_ID, +STATUS AS IS_COMPLIANT +FROM DM_POLICY_COMPLIANCE_STATUS) DEVICE_WITH_POLICY_INFO +ON DEVICE_INFO.DEVICE_ID = DEVICE_WITH_POLICY_INFO.DEVICE_ID +ORDER BY DEVICE_INFO.DEVICE_ID; + +CREATE VIEW FEATURE_NON_COMPLIANCE_INFO AS +SELECT +DM_DEVICE.ID AS DEVICE_ID, +DM_DEVICE.DEVICE_IDENTIFICATION, +DM_DEVICE_DETAIL.DEVICE_MODEL, +DM_DEVICE_DETAIL.VENDOR, +DM_DEVICE_DETAIL.OS_VERSION, +DM_ENROLMENT.OWNERSHIP, +DM_ENROLMENT.OWNER, +DM_ENROLMENT.STATUS AS CONNECTIVITY_STATUS, +DM_POLICY_COMPLIANCE_STATUS.POLICY_ID, +DM_DEVICE_TYPE.NAME AS PLATFORM, +DM_POLICY_COMPLIANCE_FEATURES.FEATURE_CODE, +DM_POLICY_COMPLIANCE_FEATURES.STATUS AS IS_COMPLAINT, +DM_DEVICE.TENANT_ID +FROM +DM_POLICY_COMPLIANCE_FEATURES, DM_POLICY_COMPLIANCE_STATUS, DM_ENROLMENT, DM_DEVICE, DM_DEVICE_TYPE, DM_DEVICE_DETAIL +WHERE +DM_POLICY_COMPLIANCE_FEATURES.COMPLIANCE_STATUS_ID = DM_POLICY_COMPLIANCE_STATUS.ID AND +DM_POLICY_COMPLIANCE_STATUS.ENROLMENT_ID = DM_ENROLMENT.ID AND +DM_POLICY_COMPLIANCE_STATUS.DEVICE_ID = DM_DEVICE.ID AND +DM_DEVICE.DEVICE_TYPE_ID = DM_DEVICE_TYPE.ID AND +DM_DEVICE.ID = DM_DEVICE_DETAIL.DEVICE_ID +ORDER BY TENANT_ID, DEVICE_ID; + +-- END OF DASHBOARD RELATED VIEWS -- + +-- DM_EXT_GROUP_MAPPING TABLE-- +CREATE TABLE IF NOT EXISTS DM_EXT_GROUP_MAPPING ( + ID INT NOT NULL AUTO_INCREMENT, + TRACCAR_GROUP_ID INT DEFAULT 0, + GROUP_ID INT NOT NULL, + TENANT_ID INT NOT NULL, + STATUS INT DEFAULT 0, + PRIMARY KEY (ID) +); +-- END OF DM_EXT_GROUP_MAPPING TABLE-- + +-- END OF DM_EXT_DEVICE_MAPPING TABLE-- +CREATE TABLE IF NOT EXISTS DM_EXT_DEVICE_MAPPING ( + ID INT NOT NULL AUTO_INCREMENT, + TRACCAR_DEVICE_ID INT DEFAULT 0, + DEVICE_ID INT NOT NULL, + TENANT_ID INT NOT NULL, + STATUS INT DEFAULT 0, + PRIMARY KEY (ID) +); +-- END OF DM_EXT_DEVICE_MAPPING TABLE-- + +-- END OF DM_EXT_PERMISSION_MAPPING TABLE-- +CREATE TABLE IF NOT EXISTS DM_EXT_PERMISSION_MAPPING ( + TRACCAR_DEVICE_ID INT DEFAULT 0, + TRACCAR_USER_ID INT DEFAULT 0 +); +-- END OF DM_EXT_PERMISSION_MAPPING TABLE-- diff --git a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/testng.xml b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/testng.xml new file mode 100644 index 0000000000..561fc24753 --- /dev/null +++ b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/testng.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/user-test/user-mgt-registry-test.xml b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/user-test/user-mgt-registry-test.xml new file mode 100644 index 0000000000..fc32a2698d --- /dev/null +++ b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/test/resources/user-test/user-mgt-registry-test.xml @@ -0,0 +1,101 @@ + + + + + true + admin + + admin + admin + + everyone + false + 500 + jdbc:h2:target/databasetest/CARBON_TEST + org.h2.Driver + 50 + 60000 + 5 + + + [\S]{5,30}$ + [\\S]{5,30} + SELECT * FROM UM_USER WHERE UM_USER_NAME=? AND UM_TENANT_ID=? + + + + + + + + + + + + + + + + SHA-256 + true + false + false + wso2.com + true + 100 + + + INSERT INTO UM_ROLE (UM_ROLE_NAME, UM_TENANT_ID) VALUES (?, ?) + + + + + + + + + + + + + + + + + org.wso2.carbon.user.core.tenant.JDBCTenantManager + + + true + + + + login + manage-configuration + manage-security + upload-services + manage-services + manage-lc-configuration + manage-mediation + monitor-system + delegate-identity + + + diff --git a/components/device-mgt-extensions/pom.xml b/components/device-mgt-extensions/pom.xml index 2501e79a68..ab1876a908 100644 --- a/components/device-mgt-extensions/pom.xml +++ b/components/device-mgt-extensions/pom.xml @@ -44,6 +44,8 @@ io.entgra.device.mgt.core.device.mgt.extensions.defaultrole.manager io.entgra.device.mgt.core.device.mgt.extensions.stateengine io.entgra.device.mgt.core.device.mgt.extensions.userstore.role.mapper + io.entgra.device.mgt.core.device.mgt.extensions.device.organization + io.entgra.device.mgt.core.device.mgt.extensions.device.organization.api diff --git a/features/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization.api.feature/pom.xml b/features/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization.api.feature/pom.xml new file mode 100644 index 0000000000..11c43c203a --- /dev/null +++ b/features/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization.api.feature/pom.xml @@ -0,0 +1,120 @@ + + + + + + + io.entgra.device.mgt.core + device-mgt-extensions-feature + 5.0.40-SNAPSHOT + + + 4.0.0 + io.entgra.device.mgt.core.device.mgt.extensions.device.organization.api.feature + pom + Entgra IoT - Device Organization Management API Feature + http://entgra.io + This feature contains the APIs required for Device Organization Management. + + + + + org.apache.maven.plugins + maven-dependency-plugin + + + copy + package + + copy + + + + + io.entgra.device.mgt.core + io.entgra.device.mgt.core.device.mgt.extensions.device.organization.api + + ${project.version} + war + true + + ${project.build.directory}/maven-shared-archive-resources/webapps + + api#device-org#v1.0.war + + + + + + + + org.apache.maven.plugins + maven-resources-plugin + + + copy-resources + generate-resources + + copy-resources + + + src/main/resources + + + resources + + build.properties + p2.inf + + + + + + + + + org.wso2.maven + carbon-p2-plugin + + + p2-feature-generation + package + + p2-feature-gen + + + io.entgra.device.mgt.core.device.mgt.extensions.device.organization.api + ../../../features/etc/feature.properties + + + + org.wso2.carbon.p2.category.type:server + + org.eclipse.equinox.p2.type.group:false + + + + + + + + + + + \ No newline at end of file diff --git a/features/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization.api.feature/src/main/resources/build.properties b/features/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization.api.feature/src/main/resources/build.properties new file mode 100644 index 0000000000..d724bde701 --- /dev/null +++ b/features/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization.api.feature/src/main/resources/build.properties @@ -0,0 +1,19 @@ +# +# Copyright (c) 2018 - 2023, 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. +# + +custom = true \ No newline at end of file diff --git a/features/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization.api.feature/src/main/resources/p2.inf b/features/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization.api.feature/src/main/resources/p2.inf new file mode 100644 index 0000000000..e023f7393d --- /dev/null +++ b/features/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization.api.feature/src/main/resources/p2.inf @@ -0,0 +1,3 @@ +instructions.configure = \ +org.eclipse.equinox.p2.touchpoint.natives.mkdir(path:${installFolder}/../../deployment/server/webapps/);\ +org.eclipse.equinox.p2.touchpoint.natives.copy(source:${installFolder}/../features/io.entgra.device.mgt.core.device.mgt.extensions.device.organization.api_${feature.version}/webapps/api#device-org#v1.0.war,target:${installFolder}/../../deployment/server/webapps/api#device-org#v1.0.war,overwrite:true);\ diff --git a/features/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization.feature/pom.xml b/features/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization.feature/pom.xml new file mode 100644 index 0000000000..d43ddb34c4 --- /dev/null +++ b/features/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization.feature/pom.xml @@ -0,0 +1,106 @@ + + + + + + + io.entgra.device.mgt.core + device-mgt-extensions-feature + 5.0.40-SNAPSHOT + ../pom.xml + + + 4.0.0 + io.entgra.device.mgt.core.device.mgt.extensions.device.organization.feature + pom + Entgra IoT - Device Organization Feature + http://entgra.io + Entgra IoT - Device Organization Feature + + + + io.entgra.device.mgt.core + io.entgra.device.mgt.core.device.mgt.extensions.device.organization + ${io.entgra.device.mgt.core.version} + + + + + + + maven-resources-plugin + 2.6 + + + copy-resources + generate-resources + + copy-resources + + + src/main/resources + + + resources + + build.properties + p2.inf + + + + + + + + + org.wso2.maven + carbon-p2-plugin + ${carbon.p2.plugin.version} + + + p2-feature-generation + package + + p2-feature-gen + + + io.entgra.device.mgt.core.device.mgt.extensions.device.organization + ../../../features/etc/feature.properties + + + org.wso2.carbon.p2.category.type:server + org.eclipse.equinox.p2.type.group:false + + + + + io.entgra.device.mgt.core:io.entgra.device.mgt.core.device.mgt.extensions.device.organization:${io.entgra.device.mgt.core.version} + + + + org.wso2.carbon.core.server:${carbon.kernel.version} + io.entgra.device.mgt.core.device.mgt.server:${io.entgra.device.mgt.core.version} + + + + + + + + \ No newline at end of file diff --git a/features/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization.feature/src/main/resources/build.properties b/features/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization.feature/src/main/resources/build.properties new file mode 100644 index 0000000000..d724bde701 --- /dev/null +++ b/features/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization.feature/src/main/resources/build.properties @@ -0,0 +1,19 @@ +# +# Copyright (c) 2018 - 2023, 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. +# + +custom = true \ No newline at end of file diff --git a/features/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization.feature/src/main/resources/p2.inf b/features/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization.feature/src/main/resources/p2.inf new file mode 100644 index 0000000000..7ab37b9d7d --- /dev/null +++ b/features/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization.feature/src/main/resources/p2.inf @@ -0,0 +1 @@ +instructions.configure = \ \ No newline at end of file diff --git a/features/device-mgt-extensions/pom.xml b/features/device-mgt-extensions/pom.xml index c6ab90e58b..9210d4af15 100644 --- a/features/device-mgt-extensions/pom.xml +++ b/features/device-mgt-extensions/pom.xml @@ -42,6 +42,8 @@ io.entgra.device.mgt.core.device.mgt.extensions.logger.feature io.entgra.device.mgt.core.device.mgt.extensions.stateengine.feature io.entgra.device.mgt.core.device.mgt.extensions.userstore.role.mapper + io.entgra.device.mgt.core.device.mgt.extensions.device.organization.feature + io.entgra.device.mgt.core.device.mgt.extensions.device.organization.api.feature diff --git a/features/device-mgt/io.entgra.device.mgt.core.device.mgt.basics.feature/src/main/resources/conf/mdm-ui-config.xml b/features/device-mgt/io.entgra.device.mgt.core.device.mgt.basics.feature/src/main/resources/conf/mdm-ui-config.xml index de5da5b4ba..f5208c958f 100644 --- a/features/device-mgt/io.entgra.device.mgt.core.device.mgt.basics.feature/src/main/resources/conf/mdm-ui-config.xml +++ b/features/device-mgt/io.entgra.device.mgt.core.device.mgt.basics.feature/src/main/resources/conf/mdm-ui-config.xml @@ -370,7 +370,6 @@ dm:metadata:update dm:metadata:remove and:ops:add-google-acc - and:ops:authenticate-acc and:ops:update-default-sim and:ops:add-google-acc and:ops:device-info @@ -407,6 +406,10 @@ am:store:vpp:assets:view and:devices:enroll ios:devices:enroll + dm:device-org:view + dm:device-org:add + dm:device-org:modify + dm:device-org:delete dm:admin:cea:view dm:admin:cea:add dm:admin:cea:update diff --git a/features/device-mgt/io.entgra.device.mgt.core.device.mgt.basics.feature/src/main/resources/dbscripts/cdm/h2.sql b/features/device-mgt/io.entgra.device.mgt.core.device.mgt.basics.feature/src/main/resources/dbscripts/cdm/h2.sql index 7df1fd271e..43e57cf430 100644 --- a/features/device-mgt/io.entgra.device.mgt.core.device.mgt.basics.feature/src/main/resources/dbscripts/cdm/h2.sql +++ b/features/device-mgt/io.entgra.device.mgt.core.device.mgt.basics.feature/src/main/resources/dbscripts/cdm/h2.sql @@ -840,6 +840,24 @@ CREATE TABLE SUB_OPERATION_TEMPLATE ( -- END OF SUB_OPERATION_TEMPLATE TABLE-- +-- DM_DEVICE_ORGANIZATION TABLE-- +CREATE TABLE IF NOT EXISTS DM_DEVICE_ORGANIZATION +( + ORGANIZATION_ID INT NOT NULL AUTO_INCREMENT, + TENANT_ID INT DEFAULT 0, + DEVICE_ID INT(11) NOT NULL, + PARENT_DEVICE_ID INT(11) DEFAULT NULL, + DEVICE_ORGANIZATION_META TEXT DEFAULT NULL, + LAST_UPDATED_TIMESTAMP TIMESTAMP NOT NULL, + PRIMARY KEY (ORGANIZATION_ID), + CONSTRAINT fk_DM_DEVICE_DM_ID FOREIGN KEY (DEVICE_ID) + REFERENCES DM_DEVICE (ID) ON DELETE NO ACTION ON UPDATE NO ACTION, + CONSTRAINT fk_DM_PARENT_DEVICE_DM_ID FOREIGN KEY (PARENT_DEVICE_ID) + REFERENCES DM_DEVICE (ID) ON DELETE NO ACTION ON UPDATE NO ACTION, + CONSTRAINT CHILD_PARENT_COMP_KEY UNIQUE (DEVICE_ID, PARENT_DEVICE_ID) + ); +-- END OF DM_DEVICE_ORGANIZATION TABLE-- + -- DM_CEA_POLICIES TABLE -- CREATE TABLE IF NOT EXISTS DM_CEA_POLICIES ( @@ -853,3 +871,4 @@ CREATE TABLE IF NOT EXISTS DM_CEA_POLICIES ( ); -- END OF DM_CEA_POLICIES TABLE -- + diff --git a/features/device-mgt/io.entgra.device.mgt.core.device.mgt.basics.feature/src/main/resources/dbscripts/cdm/mssql.sql b/features/device-mgt/io.entgra.device.mgt.core.device.mgt.basics.feature/src/main/resources/dbscripts/cdm/mssql.sql index 053390b884..318dfd2a76 100644 --- a/features/device-mgt/io.entgra.device.mgt.core.device.mgt.basics.feature/src/main/resources/dbscripts/cdm/mssql.sql +++ b/features/device-mgt/io.entgra.device.mgt.core.device.mgt.basics.feature/src/main/resources/dbscripts/cdm/mssql.sql @@ -915,6 +915,23 @@ CREATE TABLE SUB_OPERATION_TEMPLATE ( -- END SUB_OPERATION_TEMPLATE TABLE-- +-- DM_DEVICE_ORGANIZATION TABLE-- +CREATE TABLE IF NOT EXISTS DM_DEVICE_ORGANIZATION ( + ORGANIZATION_ID INTEGER NOT NULL IDENTITY(1,1), + TENANT_ID INTEGER NOT NULL, + DEVICE_ID INTEGER NOT NULL, + PARENT_DEVICE_ID INTEGER DEFAULT NULL, + DEVICE_ORGANIZATION_META TEXT DEFAULT NULL, + LAST_UPDATED_TIMESTAMP BIGINT NOT NULL, + PRIMARY KEY (ORGANIZATION_ID), + CONSTRAINT fk_DM_DEVICE_DM_ID FOREIGN KEY (DEVICE_ID) + REFERENCES DM_DEVICE (ID) ON DELETE NO ACTION ON UPDATE NO ACTION, + CONSTRAINT fk_DM_PARENT_DEVICE_DM_ID FOREIGN KEY (PARENT_DEVICE_ID) + REFERENCES DM_DEVICE (ID) ON DELETE NO ACTION ON UPDATE NO ACTION, + CONSTRAINT CHILD_PARENT_COMP_KEY UNIQUE (DEVICE_ID, PARENT_DEVICE_ID) + ); +-- END OF DM_DEVICE_ORGANIZATION TABLE-- + -- DM_CEA_POLICIES TABLE -- IF NOT EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'DM_CEA_POLICIES') diff --git a/features/device-mgt/io.entgra.device.mgt.core.device.mgt.basics.feature/src/main/resources/dbscripts/cdm/mysql.sql b/features/device-mgt/io.entgra.device.mgt.core.device.mgt.basics.feature/src/main/resources/dbscripts/cdm/mysql.sql index 33b20d1b93..ce963d1437 100644 --- a/features/device-mgt/io.entgra.device.mgt.core.device.mgt.basics.feature/src/main/resources/dbscripts/cdm/mysql.sql +++ b/features/device-mgt/io.entgra.device.mgt.core.device.mgt.basics.feature/src/main/resources/dbscripts/cdm/mysql.sql @@ -908,6 +908,23 @@ CREATE TABLE SUB_OPERATION_TEMPLATE ( -- END OF SUB_OPERATION_TEMPLATE TABLE-- +-- DM_DEVICE_ORGANIZATION TABLE-- +CREATE TABLE IF NOT EXISTS DM_DEVICE_ORGANIZATION ( + ORGANIZATION_ID INT NOT NULL AUTO_INCREMENT, + TENANT_ID INT DEFAULT 0, + DEVICE_ID INT(11) NOT NULL, + PARENT_DEVICE_ID INT(11) DEFAULT NULL, + DEVICE_ORGANIZATION_META TEXT DEFAULT NULL, + LAST_UPDATED_TIMESTAMP TIMESTAMP NOT NULL, + PRIMARY KEY (ORGANIZATION_ID), + CONSTRAINT fk_DM_DEVICE_DM_ID FOREIGN KEY (DEVICE_ID) + REFERENCES DM_DEVICE (ID) ON DELETE NO ACTION ON UPDATE NO ACTION, + CONSTRAINT fk_DM_PARENT_DEVICE_DM_ID FOREIGN KEY (PARENT_DEVICE_ID) + REFERENCES DM_DEVICE (ID) ON DELETE NO ACTION ON UPDATE NO ACTION, + CONSTRAINT CHILD_PARENT_COMP_KEY UNIQUE (DEVICE_ID, PARENT_DEVICE_ID) + ); +-- END OF DM_DEVICE_ORGANIZATION TABLE-- + -- DM_CEA_POLICIES TABLE -- CREATE TABLE IF NOT EXISTS DM_CEA_POLICIES ( diff --git a/features/device-mgt/io.entgra.device.mgt.core.device.mgt.basics.feature/src/main/resources/dbscripts/cdm/oracle.sql b/features/device-mgt/io.entgra.device.mgt.core.device.mgt.basics.feature/src/main/resources/dbscripts/cdm/oracle.sql index 2b064d516b..d632be52aa 100644 --- a/features/device-mgt/io.entgra.device.mgt.core.device.mgt.basics.feature/src/main/resources/dbscripts/cdm/oracle.sql +++ b/features/device-mgt/io.entgra.device.mgt.core.device.mgt.basics.feature/src/main/resources/dbscripts/cdm/oracle.sql @@ -726,7 +726,7 @@ CREATE TABLE DM_APPLICATION ( MEMORY_USAGE NUMBER(10) NULL, IS_ACTIVE NUMBER(10) DEFAULT 0 NOT NULL, DEVICE_ID NUMBER(10) NOT NULL, - ENROLMENT_ID NUMBER(10 NOT NULL, + ENROLMENT_ID NUMBER(10) NOT NULL, TENANT_ID NUMBER(10) NOT NULL, CONSTRAINT PK_DM_APPLICATION PRIMARY KEY (ID), CONSTRAINT fk_dm_device FOREIGN KEY (DEVICE_ID) REFERENCES @@ -1192,9 +1192,43 @@ ALTER TABLE SUB_OPERATION_TEMPLATE -- Generate ID using sequence and trigger CREATE SEQUENCE SUB_OPERATION_TEMPLATE_seq START WITH 1 INCREMENT BY 1; - +/ -- END OF SUB_OPERATION_TEMPLATE TABLE-- +-- DM_DEVICE_ORGANIZATION TABLE-- +CREATE TABLE IF NOT EXISTS DM_DEVICE_ORGANIZATION ( + ORGANIZATION_ID NUMBER(10) NOT NULL, + TENANT_ID NUMBER(10) NOT NULL, + DEVICE_ID NUMBER(10) NOT NULL, + PARENT_DEVICE_ID NUMBER(10) DEFAULT NULL, + DEVICE_ORGANIZATION_META CLOB DEFAULT NULL, + LAST_UPDATED_TIMESTAMP TIMESTAMP(0) NOT NULL, + CONSTRAINT PK_DM_DEVICE_ORGANIZATION PRIMARY KEY (ID), + CONSTRAINT fk_DM_DEVICE_DM_ID FOREIGN KEY (DEVICE_ID) + REFERENCES DM_DEVICE (ID) ON DELETE NO ACTION ON UPDATE NO ACTION, + CONSTRAINT fk_DM_PARENT_DEVICE_DM_ID FOREIGN KEY (PARENT_DEVICE_ID) + REFERENCES DM_DEVICE (ID) ON DELETE NO ACTION ON UPDATE NO ACTION, + CONSTRAINT CHILD_PARENT_COMP_KEY UNIQUE (DEVICE_ID, PARENT_DEVICE_ID) + ); +/ +-- Generate ID using sequence and trigger +CREATE SEQUENCE DM_DEVICE_ORGANIZATION_seq START WITH 1 INCREMENT BY 1 NOCACHE +/ + +CREATE OR REPLACE TRIGGER DM_DEVICE_ORGANIZATION_seq_tr +BEFORE INSERT +ON DM_DEVICE_ORGANIZATION +REFERENCING NEW AS NEW +FOR EACH ROW +WHEN (NEW.ORGANIZATION_ID IS NULL) +BEGIN +SELECT DM_DEVICE_ORGANIZATION_seq.NEXTVAL +INTO :NEW.ORGANIZATION_ID +FROM DUAL; +END; +/ +-- END OF DM_DEVICE_ORGANIZATION TABLE-- + -- DM_CEA_POLICIES TABLE -- DECLARE diff --git a/features/device-mgt/io.entgra.device.mgt.core.device.mgt.basics.feature/src/main/resources/dbscripts/cdm/postgresql.sql b/features/device-mgt/io.entgra.device.mgt.core.device.mgt.basics.feature/src/main/resources/dbscripts/cdm/postgresql.sql index 748b94fa4e..bc22e6db63 100644 --- a/features/device-mgt/io.entgra.device.mgt.core.device.mgt.basics.feature/src/main/resources/dbscripts/cdm/postgresql.sql +++ b/features/device-mgt/io.entgra.device.mgt.core.device.mgt.basics.feature/src/main/resources/dbscripts/cdm/postgresql.sql @@ -846,6 +846,25 @@ CREATE TABLE DM_DEVICE_CERTIFICATE ( PRIMARY KEY (ID) ) +-- DM_DEVICE_ORGANIZATION TABLE-- +CREATE SEQUENCE DM_DEVICE_ORGANIZATION_seq; + +CREATE TABLE IF NOT EXISTS DM_DEVICE_ORGANIZATION ( + ORGANIZATION_ID INTEGER DEFAULT NEXTVAL ('DM_DEVICE_ORGANIZATION_seq') NOT NULL, + TENANT_ID INTEGER NOT NULL, + DEVICE_ID INTEGER NOT NULL, + PARENT_DEVICE_ID INTEGER DEFAULT NULL, + DEVICE_ORGANIZATION_META TEXT DEFAULT NULL, + LAST_UPDATED_TIMESTAMP TIMESTAMP(0) NOT NULL NOT NULL, + PRIMARY KEY (ORGANIZATION_ID), + CONSTRAINT fk_DM_DEVICE_DM_ID FOREIGN KEY (DEVICE_ID) + REFERENCES DM_DEVICE (ID) ON DELETE NO ACTION ON UPDATE NO ACTION, + CONSTRAINT fk_DM_PARENT_DEVICE_DM_ID FOREIGN KEY (PARENT_DEVICE_ID) + REFERENCES DM_DEVICE (ID) ON DELETE NO ACTION ON UPDATE NO ACTION, + CONSTRAINT CHILD_PARENT_COMP_KEY UNIQUE (DEVICE_ID, PARENT_DEVICE_ID) + ); +-- END OF DM_DEVICE_ORGANIZATION TABLE-- + -- DM_CEA_POLICIES TABLE -- CREATE TABLE IF NOT EXISTS DM_CEA_POLICIES ( diff --git a/pom.xml b/pom.xml index 398ed6170a..dc526efe6c 100644 --- a/pom.xml +++ b/pom.xml @@ -1699,6 +1699,16 @@ io.entgra.device.mgt.core.device.mgt.extensions.pull.notification ${io.entgra.device.mgt.core.version} + + io.entgra.device.mgt.core + io.entgra.device.mgt.core.device.mgt.extensions.device.organization + ${io.entgra.device.mgt.core.version} + + + io.entgra.device.mgt.core + io.entgra.device.mgt.core.device.mgt.extensions.device.organization.api + ${io.entgra.device.mgt.core.version} + org.wso2.orbit.com.fasterxml.jackson.core jackson-annotations