diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/operation/mgt/OperationManager.java b/components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/operation/mgt/OperationManager.java index 3a0916b49f0..710facd64f8 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/operation/mgt/OperationManager.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/operation/mgt/OperationManager.java @@ -19,6 +19,7 @@ package org.wso2.carbon.device.mgt.common.operation.mgt; import org.wso2.carbon.device.mgt.common.DeviceIdentifier; import org.wso2.carbon.device.mgt.common.DeviceManagementException; +import org.wso2.carbon.device.mgt.common.PaginationResult; import java.util.List; @@ -41,12 +42,24 @@ public interface OperationManager { /** * Method to retrieve the list of all operations to a device. * - * @param deviceId DeviceIdentifier of the device + * @param deviceId * @throws OperationManagementException If some unusual behaviour is observed while fetching the * operation list. */ List getOperations(DeviceIdentifier deviceId) throws OperationManagementException; + /** + * Method to retrieve all the operations applied to a device with pagination support. + * + * @param deviceId DeviceIdentifier of the device + * @param index Starting row number + * @param limit No of rows to fetch + * @return PaginationResult - Result including the required parameters necessary to do pagination. + * @throws OperationManagementException If some unusual behaviour is observed while fetching the + * operation list. + */ + PaginationResult getOperations(DeviceIdentifier deviceId, int index, int limit) throws OperationManagementException; + /** * Method to retrieve the list of available operations to a device. * diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/dao/DeviceManagementDAOFactory.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/dao/DeviceManagementDAOFactory.java index e72efc1d791..29737f4894f 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/dao/DeviceManagementDAOFactory.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/dao/DeviceManagementDAOFactory.java @@ -26,6 +26,10 @@ import org.wso2.carbon.device.mgt.common.TransactionManagementException; import org.wso2.carbon.device.mgt.core.config.datasource.DataSourceConfig; import org.wso2.carbon.device.mgt.core.config.datasource.JNDILookupDefinition; import org.wso2.carbon.device.mgt.core.dao.impl.*; +import org.wso2.carbon.device.mgt.core.dao.impl.device.GenericDeviceDAOImpl; +import org.wso2.carbon.device.mgt.core.dao.impl.device.OracleDeviceDAOImpl; +import org.wso2.carbon.device.mgt.core.dao.impl.device.PostgreSQLDeviceDAOImpl; +import org.wso2.carbon.device.mgt.core.dao.impl.device.SQLServerDeviceDAOImpl; import org.wso2.carbon.device.mgt.core.dao.util.DeviceManagementDAOUtil; import javax.sql.DataSource; @@ -96,6 +100,7 @@ public class DeviceManagementDAOFactory { case DeviceManagementConstants.DataBaseTypes.DB_TYPE_MSSQL: return new SQLServerDeviceDAOImpl(); case DeviceManagementConstants.DataBaseTypes.DB_TYPE_POSTGRESQL: + return new PostgreSQLDeviceDAOImpl(); case DeviceManagementConstants.DataBaseTypes.DB_TYPE_H2: case DeviceManagementConstants.DataBaseTypes.DB_TYPE_MYSQL: default: diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/dao/impl/AbstractDeviceDAOImpl.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/dao/impl/AbstractDeviceDAOImpl.java index 14e1109cf57..92deb13643e 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/dao/impl/AbstractDeviceDAOImpl.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/dao/impl/AbstractDeviceDAOImpl.java @@ -26,6 +26,7 @@ import org.wso2.carbon.device.mgt.core.dao.DeviceDAO; import org.wso2.carbon.device.mgt.core.dao.DeviceManagementDAOException; import org.wso2.carbon.device.mgt.core.dao.DeviceManagementDAOFactory; import org.wso2.carbon.device.mgt.core.dao.util.DeviceManagementDAOUtil; +import org.wso2.carbon.device.mgt.core.dto.DeviceType; import java.sql.*; import java.util.ArrayList; @@ -652,4 +653,29 @@ public abstract class AbstractDeviceDAOImpl implements DeviceDAO { return devices; } + @Override + public List getDeviceTypes() + throws DeviceManagementDAOException { + Connection conn; + PreparedStatement stmt = null; + ResultSet rs = null; + List deviceTypes; + try { + conn = this.getConnection(); + String sql = "SELECT t.ID, t.NAME FROM DM_DEVICE_TYPE t"; + stmt = conn.prepareStatement(sql); + rs = stmt.executeQuery(); + deviceTypes = new ArrayList<>(); + while (rs.next()) { + DeviceType deviceType = DeviceManagementDAOUtil.loadDeviceType(rs); + deviceTypes.add(deviceType); + } + } catch (SQLException e) { + throw new DeviceManagementDAOException("Error occurred while listing device types.", e); + } finally { + DeviceManagementDAOUtil.cleanupResources(stmt, rs); + } + return deviceTypes; + } + } diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/dao/impl/ApplicationDAOImpl.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/dao/impl/ApplicationDAOImpl.java index b2f79dbbd6e..290ddacf1f9 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/dao/impl/ApplicationDAOImpl.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/dao/impl/ApplicationDAOImpl.java @@ -26,9 +26,7 @@ import org.wso2.carbon.device.mgt.core.dao.DeviceManagementDAOException; import org.wso2.carbon.device.mgt.core.dao.DeviceManagementDAOFactory; import org.wso2.carbon.device.mgt.core.dao.util.DeviceManagementDAOUtil; -import java.io.ByteArrayInputStream; -import java.io.IOException; -import java.io.ObjectInputStream; +import java.io.*; import java.sql.*; import java.util.ArrayList; import java.util.List; @@ -43,6 +41,8 @@ public class ApplicationDAOImpl implements ApplicationDAO { Connection conn; PreparedStatement stmt = null; ResultSet rs = null; + ByteArrayOutputStream bao = null; + ObjectOutputStream oos = null; int applicationId = -1; try { conn = this.getConnection(); @@ -58,7 +58,12 @@ public class ApplicationDAOImpl implements ApplicationDAO { stmt.setString(6, application.getLocationUrl()); stmt.setString(7, application.getImageUrl()); stmt.setInt(8, tenantId); - stmt.setObject(9, application.getAppProperties()); + + bao = new ByteArrayOutputStream(); + oos = new ObjectOutputStream(bao); + oos.writeObject(application.getAppProperties()); + stmt.setBytes(9, bao.toByteArray()); + stmt.setString(10, application.getApplicationIdentifier()); stmt.execute(); @@ -70,7 +75,23 @@ public class ApplicationDAOImpl implements ApplicationDAO { } catch (SQLException e) { throw new DeviceManagementDAOException("Error occurred while adding application '" + application.getName() + "'", e); + } catch (IOException e) { + throw new DeviceManagementDAOException("Error occurred while serializing application properties object", e); } finally { + if (bao != null) { + try { + bao.close(); + } catch (IOException e) { + log.warn("Error occurred while closing ByteArrayOutputStream", e); + } + } + if (oos != null) { + try { + oos.close(); + } catch (IOException e) { + log.warn("Error occurred while closing ObjectOutputStream", e); + } + } DeviceManagementDAOUtil.cleanupResources(stmt, rs); } } @@ -81,6 +102,8 @@ public class ApplicationDAOImpl implements ApplicationDAO { Connection conn; PreparedStatement stmt = null; ResultSet rs; + ByteArrayOutputStream bao = null; + ObjectOutputStream oos = null; List applicationIds = new ArrayList<>(); try { conn = this.getConnection(); @@ -99,7 +122,12 @@ public class ApplicationDAOImpl implements ApplicationDAO { stmt.setString(6, application.getLocationUrl()); stmt.setString(7, application.getImageUrl()); stmt.setInt(8, tenantId); - stmt.setObject(9, application.getAppProperties()); + + bao = new ByteArrayOutputStream(); + oos = new ObjectOutputStream(bao); + oos.writeObject(application.getAppProperties()); + stmt.setBytes(9, bao.toByteArray()); + stmt.setString(10, application.getApplicationIdentifier()); stmt.executeUpdate(); @@ -111,7 +139,23 @@ public class ApplicationDAOImpl implements ApplicationDAO { return applicationIds; } catch (SQLException e) { throw new DeviceManagementDAOException("Error occurred while adding bulk application list", e); + } catch (IOException e) { + throw new DeviceManagementDAOException("Error occurred while serializing application properties object", e); } finally { + if (bao != null) { + try { + bao.close(); + } catch (IOException e) { + log.warn("Error occurred while closing ByteArrayOutputStream", e); + } + } + if (oos != null) { + try { + oos.close(); + } catch (IOException e) { + log.warn("Error occurred while closing ObjectOutputStream", e); + } + } DeviceManagementDAOUtil.cleanupResources(stmt, null); } } diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/dao/impl/GenericDeviceDAOImpl.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/dao/impl/device/GenericDeviceDAOImpl.java similarity index 87% rename from components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/dao/impl/GenericDeviceDAOImpl.java rename to components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/dao/impl/device/GenericDeviceDAOImpl.java index 4df319c577c..e6bf3b7843f 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/dao/impl/GenericDeviceDAOImpl.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/dao/impl/device/GenericDeviceDAOImpl.java @@ -16,13 +16,14 @@ * under the License. */ -package org.wso2.carbon.device.mgt.core.dao.impl; +package org.wso2.carbon.device.mgt.core.dao.impl.device; import org.wso2.carbon.device.mgt.common.Device; import org.wso2.carbon.device.mgt.common.EnrolmentInfo; import org.wso2.carbon.device.mgt.common.PaginationResult; import org.wso2.carbon.device.mgt.core.dao.DeviceManagementDAOException; import org.wso2.carbon.device.mgt.core.dao.DeviceManagementDAOFactory; +import org.wso2.carbon.device.mgt.core.dao.impl.AbstractDeviceDAOImpl; import org.wso2.carbon.device.mgt.core.dao.util.DeviceManagementDAOUtil; import org.wso2.carbon.device.mgt.core.dto.DeviceType; @@ -121,32 +122,6 @@ public class GenericDeviceDAOImpl extends AbstractDeviceDAOImpl { return result; } - @Override - public List getDeviceTypes() - throws DeviceManagementDAOException { - Connection conn; - PreparedStatement stmt = null; - ResultSet rs = null; - List deviceTypes; - try { - conn = this.getConnection(); - String sql = "SELECT t.ID, t.NAME " + - "FROM DM_DEVICE_TYPE t"; - stmt = conn.prepareStatement(sql); - rs = stmt.executeQuery(); - deviceTypes = new ArrayList<>(); - while (rs.next()) { - DeviceType deviceType = DeviceManagementDAOUtil.loadDeviceType(rs); - deviceTypes.add(deviceType); - } - } catch (SQLException e) { - throw new DeviceManagementDAOException("Error occurred while listing device types.", e); - } finally { - DeviceManagementDAOUtil.cleanupResources(stmt, rs); - } - return deviceTypes; - } - private Connection getConnection() throws SQLException { return DeviceManagementDAOFactory.getConnection(); } diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/dao/impl/OracleDeviceDAOImpl.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/dao/impl/device/OracleDeviceDAOImpl.java similarity index 85% rename from components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/dao/impl/OracleDeviceDAOImpl.java rename to components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/dao/impl/device/OracleDeviceDAOImpl.java index 92d790fe60d..d1a6c570014 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/dao/impl/OracleDeviceDAOImpl.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/dao/impl/device/OracleDeviceDAOImpl.java @@ -16,12 +16,13 @@ * under the License. */ -package org.wso2.carbon.device.mgt.core.dao.impl; +package org.wso2.carbon.device.mgt.core.dao.impl.device; import org.wso2.carbon.device.mgt.common.Device; import org.wso2.carbon.device.mgt.common.PaginationResult; import org.wso2.carbon.device.mgt.core.dao.DeviceManagementDAOException; import org.wso2.carbon.device.mgt.core.dao.DeviceManagementDAOFactory; +import org.wso2.carbon.device.mgt.core.dao.impl.AbstractDeviceDAOImpl; import org.wso2.carbon.device.mgt.core.dao.util.DeviceManagementDAOUtil; import org.wso2.carbon.device.mgt.core.dto.DeviceType; @@ -52,7 +53,7 @@ public class OracleDeviceDAOImpl extends AbstractDeviceDAOImpl { "e.DATE_OF_ENROLMENT, e.ID AS ENROLMENT_ID FROM DM_ENROLMENT e, (SELECT d.ID AS DEVICE_ID, " + "d.DESCRIPTION, d.NAME, d.DEVICE_IDENTIFICATION, t.NAME AS DEVICE_TYPE FROM DM_DEVICE d, " + "DM_DEVICE_TYPE t WHERE d.DEVICE_TYPE_ID = t.ID AND d.TENANT_ID = ?) d1 " + - "WHERE d1.DEVICE_ID = e.DEVICE_ID AND TENANT_ID = ? LIMIT ?,? ROW_NUMBER <= ?"; + "WHERE d1.DEVICE_ID = e.DEVICE_ID AND TENANT_ID = ? OFFSET ? ROWS FETCH NEXT ? ROWS ONLY"; stmt = conn.prepareStatement(sql); stmt.setInt(1, tenantId); stmt.setInt(2, tenantId); @@ -92,7 +93,7 @@ public class OracleDeviceDAOImpl extends AbstractDeviceDAOImpl { "e.DATE_OF_ENROLMENT, e.ID AS ENROLMENT_ID FROM DM_ENROLMENT e, (SELECT d.ID, d.DESCRIPTION, " + "d.NAME, d.DEVICE_IDENTIFICATION, t.NAME AS DEVICE_TYPE FROM DM_DEVICE d, " + "DM_DEVICE_TYPE t WHERE DEVICE_TYPE_ID = t.ID AND t.NAME = ? " + - "AND d.TENANT_ID = ?) d1 WHERE d1.ID = e.DEVICE_ID AND TENANT_ID = ? LIMIT ?,?"; + "AND d.TENANT_ID = ?) d1 WHERE d1.ID = e.DEVICE_ID AND TENANT_ID = ? OFFSET ? ROWS FETCH NEXT ? ROWS ONLY"; stmt = conn.prepareStatement(sql); stmt.setString(1, type); stmt.setInt(2, tenantId); @@ -117,30 +118,6 @@ public class OracleDeviceDAOImpl extends AbstractDeviceDAOImpl { return result; } - @Override public List getDeviceTypes() throws DeviceManagementDAOException { - Connection conn; - PreparedStatement stmt = null; - ResultSet rs = null; - List deviceTypes; - try { - conn = this.getConnection(); - String sql = "SELECT t.ID, t.NAME " + - "FROM DM_DEVICE_TYPE t"; - stmt = conn.prepareStatement(sql); - rs = stmt.executeQuery(); - deviceTypes = new ArrayList<>(); - while (rs.next()) { - DeviceType deviceType = DeviceManagementDAOUtil.loadDeviceType(rs); - deviceTypes.add(deviceType); - } - } catch (SQLException e) { - throw new DeviceManagementDAOException("Error occurred while listing device types.", e); - } finally { - DeviceManagementDAOUtil.cleanupResources(stmt, rs); - } - return deviceTypes; - } - private Connection getConnection() throws SQLException { return DeviceManagementDAOFactory.getConnection(); } diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/dao/impl/PostgreSQLDeviceDAOImpl.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/dao/impl/device/PostgreSQLDeviceDAOImpl.java similarity index 84% rename from components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/dao/impl/PostgreSQLDeviceDAOImpl.java rename to components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/dao/impl/device/PostgreSQLDeviceDAOImpl.java index 26b0d34d9d2..612a431fb17 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/dao/impl/PostgreSQLDeviceDAOImpl.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/dao/impl/device/PostgreSQLDeviceDAOImpl.java @@ -16,12 +16,13 @@ * under the License. */ -package org.wso2.carbon.device.mgt.core.dao.impl; +package org.wso2.carbon.device.mgt.core.dao.impl.device; import org.wso2.carbon.device.mgt.common.Device; import org.wso2.carbon.device.mgt.common.PaginationResult; import org.wso2.carbon.device.mgt.core.dao.DeviceManagementDAOException; import org.wso2.carbon.device.mgt.core.dao.DeviceManagementDAOFactory; +import org.wso2.carbon.device.mgt.core.dao.impl.AbstractDeviceDAOImpl; import org.wso2.carbon.device.mgt.core.dao.util.DeviceManagementDAOUtil; import org.wso2.carbon.device.mgt.core.dto.DeviceType; @@ -52,12 +53,12 @@ public class PostgreSQLDeviceDAOImpl extends AbstractDeviceDAOImpl { "e.DATE_OF_ENROLMENT, e.ID AS ENROLMENT_ID FROM DM_ENROLMENT e, (SELECT d.ID AS DEVICE_ID, " + "d.DESCRIPTION, d.NAME, d.DEVICE_IDENTIFICATION, t.NAME AS DEVICE_TYPE FROM DM_DEVICE d, " + "DM_DEVICE_TYPE t WHERE d.DEVICE_TYPE_ID = t.ID AND d.TENANT_ID = ?) d1 " + - "WHERE d1.DEVICE_ID = e.DEVICE_ID AND TENANT_ID = ? OFFSET ? LIMIT ?"; + "WHERE d1.DEVICE_ID = e.DEVICE_ID AND TENANT_ID = ? LIMIT ? OFFSET ?"; stmt = conn.prepareStatement(sql); stmt.setInt(1, tenantId); stmt.setInt(2, tenantId); - stmt.setInt(3, index); - stmt.setInt(4, limit); + stmt.setInt(3, limit); + stmt.setInt(4, index); rs = stmt.executeQuery(); devices = new ArrayList<>(); while (rs.next()) { @@ -92,13 +93,13 @@ public class PostgreSQLDeviceDAOImpl extends AbstractDeviceDAOImpl { "e.DATE_OF_ENROLMENT, e.ID AS ENROLMENT_ID FROM DM_ENROLMENT e, (SELECT d.ID, d.DESCRIPTION, " + "d.NAME, d.DEVICE_IDENTIFICATION, t.NAME AS DEVICE_TYPE FROM DM_DEVICE d, " + "DM_DEVICE_TYPE t WHERE DEVICE_TYPE_ID = t.ID AND t.NAME = ? " + - "AND d.TENANT_ID = ?) d1 WHERE d1.ID = e.DEVICE_ID AND TENANT_ID = ? OFFSET ? LIMIT ?"; + "AND d.TENANT_ID = ?) d1 WHERE d1.ID = e.DEVICE_ID AND TENANT_ID = ? LIMIT ? OFFSET ?"; stmt = conn.prepareStatement(sql); stmt.setString(1, type); stmt.setInt(2, tenantId); stmt.setInt(3, tenantId); - stmt.setInt(4, index); - stmt.setInt(5, limit); + stmt.setInt(4, limit); + stmt.setInt(5, index); rs = stmt.executeQuery(); devices = new ArrayList<>(); while (rs.next()) { @@ -117,30 +118,6 @@ public class PostgreSQLDeviceDAOImpl extends AbstractDeviceDAOImpl { return result; } - @Override public List getDeviceTypes() throws DeviceManagementDAOException { - Connection conn; - PreparedStatement stmt = null; - ResultSet rs = null; - List deviceTypes; - try { - conn = this.getConnection(); - String sql = "SELECT t.ID, t.NAME " + - "FROM DM_DEVICE_TYPE t"; - stmt = conn.prepareStatement(sql); - rs = stmt.executeQuery(); - deviceTypes = new ArrayList<>(); - while (rs.next()) { - DeviceType deviceType = DeviceManagementDAOUtil.loadDeviceType(rs); - deviceTypes.add(deviceType); - } - } catch (SQLException e) { - throw new DeviceManagementDAOException("Error occurred while listing device types.", e); - } finally { - DeviceManagementDAOUtil.cleanupResources(stmt, rs); - } - return deviceTypes; - } - private Connection getConnection() throws SQLException { return DeviceManagementDAOFactory.getConnection(); } diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/dao/impl/SQLServerDeviceDAOImpl.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/dao/impl/device/SQLServerDeviceDAOImpl.java similarity index 86% rename from components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/dao/impl/SQLServerDeviceDAOImpl.java rename to components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/dao/impl/device/SQLServerDeviceDAOImpl.java index 21c3ef88485..8e47ac2024f 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/dao/impl/SQLServerDeviceDAOImpl.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/dao/impl/device/SQLServerDeviceDAOImpl.java @@ -16,12 +16,13 @@ * under the License. */ -package org.wso2.carbon.device.mgt.core.dao.impl; +package org.wso2.carbon.device.mgt.core.dao.impl.device; import org.wso2.carbon.device.mgt.common.Device; import org.wso2.carbon.device.mgt.common.PaginationResult; import org.wso2.carbon.device.mgt.core.dao.DeviceManagementDAOException; import org.wso2.carbon.device.mgt.core.dao.DeviceManagementDAOFactory; +import org.wso2.carbon.device.mgt.core.dao.impl.AbstractDeviceDAOImpl; import org.wso2.carbon.device.mgt.core.dao.util.DeviceManagementDAOUtil; import org.wso2.carbon.device.mgt.core.dto.DeviceType; @@ -117,31 +118,6 @@ public class SQLServerDeviceDAOImpl extends AbstractDeviceDAOImpl { return result; } - @Override - public List getDeviceTypes() throws DeviceManagementDAOException { - Connection conn; - PreparedStatement stmt = null; - ResultSet rs = null; - List deviceTypes; - try { - conn = this.getConnection(); - String sql = "SELECT t.ID, t.NAME " + - "FROM DM_DEVICE_TYPE t"; - stmt = conn.prepareStatement(sql); - rs = stmt.executeQuery(); - deviceTypes = new ArrayList<>(); - while (rs.next()) { - DeviceType deviceType = DeviceManagementDAOUtil.loadDeviceType(rs); - deviceTypes.add(deviceType); - } - } catch (SQLException e) { - throw new DeviceManagementDAOException("Error occurred while listing device types.", e); - } finally { - DeviceManagementDAOUtil.cleanupResources(stmt, rs); - } - return deviceTypes; - } - private Connection getConnection() throws SQLException { return DeviceManagementDAOFactory.getConnection(); } diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/operation/mgt/OperationManagerImpl.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/operation/mgt/OperationManagerImpl.java index 71ea7adf721..e0018eaafe2 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/operation/mgt/OperationManagerImpl.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/operation/mgt/OperationManagerImpl.java @@ -23,6 +23,7 @@ import org.apache.commons.logging.LogFactory; import org.wso2.carbon.context.CarbonContext; import org.wso2.carbon.device.mgt.common.DeviceIdentifier; import org.wso2.carbon.device.mgt.common.EnrolmentInfo; +import org.wso2.carbon.device.mgt.common.PaginationResult; import org.wso2.carbon.device.mgt.common.TransactionManagementException; import org.wso2.carbon.device.mgt.common.authorization.DeviceAccessAuthorizationException; import org.wso2.carbon.device.mgt.common.operation.mgt.Operation; @@ -188,6 +189,67 @@ public class OperationManagerImpl implements OperationManager { return operations; } + @Override + public PaginationResult getOperations(DeviceIdentifier deviceId, int index, int limit) + throws OperationManagementException { + PaginationResult paginationResult = null; + int enrolmentId; + List operations = new ArrayList<>(); + try { + boolean isUserAuthorized = DeviceManagementDataHolder.getInstance().getDeviceAccessAuthorizationService(). + isUserAuthorized(deviceId); + if (isUserAuthorized) { + try { + try { + DeviceManagementDAOFactory.openConnection(); + int tenantId = CarbonContext.getThreadLocalCarbonContext().getTenantId(); + enrolmentId = deviceDAO.getEnrolmentByStatus(deviceId, EnrolmentInfo.Status.ACTIVE, tenantId); + } finally { + DeviceManagementDAOFactory.closeConnection(); + } + + OperationManagementDAOFactory.openConnection(); + if (enrolmentId < 0) { + throw new OperationManagementException("Device not found for given device " + + "Identifier:" + deviceId.getId() + " and given type" + + deviceId.getType()); + } + List operationList = + operationDAO.getOperationsForDevice(enrolmentId, index, limit); + for (org.wso2.carbon.device.mgt.core.dto.operation.mgt.Operation dtoOperation : operationList) { + Operation operation = OperationDAOUtil.convertOperation(dtoOperation); + operations.add(operation); + } + paginationResult = new PaginationResult(); + int count = operationDAO.getOperationCountForDevice(enrolmentId); + paginationResult.setData(operations); + paginationResult.setRecordsTotal(count); + paginationResult.setRecordsFiltered(count); + } catch (OperationManagementDAOException e) { + throw new OperationManagementException("Error occurred while retrieving the list of " + + "operations assigned for '" + deviceId.getType() + + "' device '" + deviceId.getId() + "'", e); + } catch (DeviceManagementDAOException e) { + throw new OperationManagementException("Error occurred while retrieving metadata of '" + + deviceId.getType() + "' device carrying the identifier '" + + deviceId.getId() + "'"); + } catch (SQLException e) { + throw new OperationManagementException( + "Error occurred while opening a connection to the data source", e); + } finally { + OperationManagementDAOFactory.closeConnection(); + } + } else { + log.info("User : " + getUser() + " is not authorized to fetch operations on device : " + deviceId.getId()); + } + } catch (DeviceAccessAuthorizationException e) { + throw new OperationManagementException("Error occurred while authorizing access to the devices for user : " + + this.getUser(), e); + } + + return paginationResult; + } + @Override public List getPendingOperations(DeviceIdentifier deviceId) throws OperationManagementException { diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/operation/mgt/dao/OperationDAO.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/operation/mgt/dao/OperationDAO.java index 9c0f9981534..78097cf8dda 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/operation/mgt/dao/OperationDAO.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/operation/mgt/dao/OperationDAO.java @@ -37,8 +37,15 @@ public interface OperationDAO { List getOperationsByDeviceAndStatus(int enrolmentId, Operation.Status status) throws OperationManagementDAOException; + List getOperationsByDeviceAndStatus(int enrolmentId, int index, int limit, Operation.Status status) + throws OperationManagementDAOException; + List getOperationsForDevice(int enrolmentId) throws OperationManagementDAOException; + int getOperationCountForDevice(int enrolmentId) throws OperationManagementDAOException; + + List getOperationsForDevice(int enrolmentId, int index, int limit) throws OperationManagementDAOException; + Operation getNextOperation(int enrolmentId) throws OperationManagementDAOException; void updateOperationStatus(int enrolmentId, int operationId,Operation.Status status) @@ -47,4 +54,4 @@ public interface OperationDAO { void addOperationResponse(int enrolmentId, int operationId, Object operationResponse) throws OperationManagementDAOException; -} +} \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/operation/mgt/dao/OperationManagementDAOFactory.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/operation/mgt/dao/OperationManagementDAOFactory.java index e43843a474b..4b723d92cf1 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/operation/mgt/dao/OperationManagementDAOFactory.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/operation/mgt/dao/OperationManagementDAOFactory.java @@ -20,12 +20,16 @@ package org.wso2.carbon.device.mgt.core.operation.mgt.dao; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.wso2.carbon.device.mgt.common.DeviceManagementConstants; import org.wso2.carbon.device.mgt.common.IllegalTransactionStateException; import org.wso2.carbon.device.mgt.common.TransactionManagementException; import org.wso2.carbon.device.mgt.core.config.datasource.DataSourceConfig; import org.wso2.carbon.device.mgt.core.config.datasource.JNDILookupDefinition; import org.wso2.carbon.device.mgt.core.dao.util.DeviceManagementDAOUtil; import org.wso2.carbon.device.mgt.core.operation.mgt.dao.impl.*; +import org.wso2.carbon.device.mgt.core.operation.mgt.dao.impl.operation.OracleOperationDAOImpl; +import org.wso2.carbon.device.mgt.core.operation.mgt.dao.impl.operation.PostgreSQLOperationDAOImpl; +import org.wso2.carbon.device.mgt.core.operation.mgt.dao.impl.operation.SQLServerOperationDAOImpl; import javax.sql.DataSource; import java.sql.Connection; @@ -37,6 +41,7 @@ public class OperationManagementDAOFactory { private static final Log log = LogFactory.getLog(OperationManagementDAOFactory.class); private static DataSource dataSource; + private static String databaseEngine; private static ThreadLocal currentConnection = new ThreadLocal(); public static OperationDAO getCommandOperationDAO() { @@ -60,15 +65,40 @@ public class OperationManagementDAOFactory { } public static OperationDAO getOperationDAO() { - return new OperationDAOImpl(); + if(databaseEngine != null) { + switch (databaseEngine) { + case DeviceManagementConstants.DataBaseTypes.DB_TYPE_ORACLE: + return new OracleOperationDAOImpl(); + case DeviceManagementConstants.DataBaseTypes.DB_TYPE_MSSQL: + return new SQLServerOperationDAOImpl(); + case DeviceManagementConstants.DataBaseTypes.DB_TYPE_POSTGRESQL: + return new PostgreSQLOperationDAOImpl(); + case DeviceManagementConstants.DataBaseTypes.DB_TYPE_H2: + case DeviceManagementConstants.DataBaseTypes.DB_TYPE_MYSQL: + default: + return new GenericOperationDAOImpl(); + } + } else { + return new GenericOperationDAOImpl(); + } } public static void init(DataSource dtSource) { dataSource = dtSource; + try { + databaseEngine = dataSource.getConnection().getMetaData().getDatabaseProductName(); + } catch (SQLException e) { + log.error("Error occurred while retrieving config.datasource connection", e); + } } public static void init(DataSourceConfig config) { dataSource = resolveDataSource(config); + try { + databaseEngine = dataSource.getConnection().getMetaData().getDatabaseProductName(); + } catch (SQLException e) { + log.error("Error occurred while retrieving config.datasource connection", e); + } } public static void beginTransaction() throws TransactionManagementException { diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/operation/mgt/dao/impl/CommandOperationDAOImpl.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/operation/mgt/dao/impl/CommandOperationDAOImpl.java index 8fdd35591a7..464597dc051 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/operation/mgt/dao/impl/CommandOperationDAOImpl.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/operation/mgt/dao/impl/CommandOperationDAOImpl.java @@ -31,7 +31,7 @@ import java.sql.SQLException; import java.util.ArrayList; import java.util.List; -public class CommandOperationDAOImpl extends OperationDAOImpl { +public class CommandOperationDAOImpl extends GenericOperationDAOImpl { @Override public int addOperation(Operation operation) throws OperationManagementDAOException { diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/operation/mgt/dao/impl/ConfigOperationDAOImpl.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/operation/mgt/dao/impl/ConfigOperationDAOImpl.java index f56bbff51b4..e6994977ad0 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/operation/mgt/dao/impl/ConfigOperationDAOImpl.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/operation/mgt/dao/impl/ConfigOperationDAOImpl.java @@ -35,7 +35,7 @@ import java.sql.SQLException; import java.util.ArrayList; import java.util.List; -public class ConfigOperationDAOImpl extends OperationDAOImpl { +public class ConfigOperationDAOImpl extends GenericOperationDAOImpl { private static final Log log = LogFactory.getLog(ConfigOperationDAOImpl.class); diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/operation/mgt/dao/impl/OperationDAOImpl.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/operation/mgt/dao/impl/GenericOperationDAOImpl.java similarity index 73% rename from components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/operation/mgt/dao/impl/OperationDAOImpl.java rename to components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/operation/mgt/dao/impl/GenericOperationDAOImpl.java index 90c0565c2eb..88640268260 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/operation/mgt/dao/impl/OperationDAOImpl.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/operation/mgt/dao/impl/GenericOperationDAOImpl.java @@ -1,20 +1,19 @@ /* - * Copyright (c) 2015, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * Copyright (c) 2015, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. * - * WSO2 Inc. 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 + * WSO2 Inc. 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. - * + * 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 org.wso2.carbon.device.mgt.core.operation.mgt.dao.impl; @@ -34,9 +33,12 @@ import java.util.ArrayList; import java.util.Date; import java.util.List; -public class OperationDAOImpl implements OperationDAO { +/** + * This class holds the generic implementation of OperationDAO which can be used to support ANSI db syntax. + */ +public class GenericOperationDAOImpl implements OperationDAO { - private static final Log log = LogFactory.getLog(OperationDAOImpl.class); + private static final Log log = LogFactory.getLog(GenericOperationDAOImpl.class); public int addOperation(Operation operation) throws OperationManagementDAOException { PreparedStatement stmt = null; @@ -244,7 +246,7 @@ public class OperationDAOImpl implements OperationDAO { String sql = "SELECT o.ID, TYPE, CREATED_TIMESTAMP, RECEIVED_TIMESTAMP, OPERATION_CODE " + "FROM DM_OPERATION o " + "INNER JOIN (SELECT * FROM DM_ENROLMENT_OP_MAPPING dm " + - "WHERE dm.ENROLMENT_ID = ? AND dm.STATUS = ?) om ON o.ID = om.OPERATION_ID ORDER BY o.CREATED_TIMESTAMP ASC"; + "WHERE dm.ENROLMENT_ID = ? AND dm.STATUS = ?) om ON o.ID = om.OPERATION_ID ORDER BY o.CREATED_TIMESTAMP DESC"; stmt = conn.prepareStatement(sql); stmt.setInt(1, enrolmentId); stmt.setString(2, status.toString()); @@ -273,6 +275,51 @@ public class OperationDAOImpl implements OperationDAO { return operations; } + @Override + public List getOperationsByDeviceAndStatus(int enrolmentId, int index, int limit, + Operation.Status status) + throws OperationManagementDAOException { + PreparedStatement stmt = null; + ResultSet rs = null; + Operation operation; + List operations = new ArrayList(); + try { + Connection conn = OperationManagementDAOFactory.getConnection(); + String sql = "SELECT o.ID, TYPE, CREATED_TIMESTAMP, RECEIVED_TIMESTAMP, OPERATION_CODE " + + "FROM DM_OPERATION o " + + "INNER JOIN (SELECT * FROM DM_ENROLMENT_OP_MAPPING dm " + + "WHERE dm.ENROLMENT_ID = ? AND dm.STATUS = ?) om ON o.ID = om.OPERATION_ID ORDER BY " + + "o.CREATED_TIMESTAMP DESC LIMIT ?,?"; + stmt = conn.prepareStatement(sql); + stmt.setInt(1, enrolmentId); + stmt.setString(2, status.toString()); + stmt.setInt(3, index); + stmt.setInt(4, limit); + rs = stmt.executeQuery(); + + while (rs.next()) { + operation = new Operation(); + operation.setId(rs.getInt("ID")); + operation.setType(Operation.Type.valueOf(rs.getString("TYPE"))); + operation.setCreatedTimeStamp(rs.getTimestamp("CREATED_TIMESTAMP").toString()); + if (rs.getTimestamp("RECEIVED_TIMESTAMP") == null) { + operation.setReceivedTimeStamp(""); + } else { + operation.setReceivedTimeStamp(rs.getTimestamp("RECEIVED_TIMESTAMP").toString()); + } + operation.setCode(rs.getString("OPERATION_CODE")); + operation.setStatus(status); + operations.add(operation); + } + } catch (SQLException e) { + throw new OperationManagementDAOException("SQL error occurred while retrieving the operation " + + "available for the device'" + enrolmentId + "' with status '" + status.toString(), e); + } finally { + OperationManagementDAOUtil.cleanupResources(stmt, rs); + } + return operations; + } + @Override public List getOperationsForDevice(int enrolmentId) throws OperationManagementDAOException { PreparedStatement stmt = null; @@ -284,7 +331,7 @@ public class OperationDAOImpl implements OperationDAO { String sql = "SELECT o.ID, TYPE, CREATED_TIMESTAMP, RECEIVED_TIMESTAMP, " + "OPERATION_CODE, om.STATUS FROM DM_OPERATION o " + "INNER JOIN (SELECT * FROM DM_ENROLMENT_OP_MAPPING dm " + - "WHERE dm.ENROLMENT_ID = ?) om ON o.ID = om.OPERATION_ID ORDER BY o.CREATED_TIMESTAMP ASC"; + "WHERE dm.ENROLMENT_ID = ?) om ON o.ID = om.OPERATION_ID ORDER BY o.CREATED_TIMESTAMP DESC"; stmt = conn.prepareStatement(sql); stmt.setInt(1, enrolmentId); rs = stmt.executeQuery(); @@ -312,6 +359,72 @@ public class OperationDAOImpl implements OperationDAO { return operations; } + @Override + public List getOperationsForDevice(int enrolmentId, int index, int limit) + throws OperationManagementDAOException { + PreparedStatement stmt = null; + ResultSet rs = null; + Operation operation; + List operations = new ArrayList(); + try { + Connection conn = OperationManagementDAOFactory.getConnection(); + String sql = "SELECT o.ID, TYPE, CREATED_TIMESTAMP, RECEIVED_TIMESTAMP, " + + "OPERATION_CODE, om.STATUS FROM DM_OPERATION o " + + "INNER JOIN (SELECT * FROM DM_ENROLMENT_OP_MAPPING dm " + + "WHERE dm.ENROLMENT_ID = ?) om ON o.ID = om.OPERATION_ID ORDER BY o.CREATED_TIMESTAMP DESC LIMIT ?,?"; + stmt = conn.prepareStatement(sql); + stmt.setInt(1, enrolmentId); + stmt.setInt(2, index); + stmt.setInt(3, limit); + rs = stmt.executeQuery(); + + while (rs.next()) { + operation = new Operation(); + operation.setId(rs.getInt("ID")); + operation.setType(Operation.Type.valueOf(rs.getString("TYPE"))); + operation.setCreatedTimeStamp(rs.getTimestamp("CREATED_TIMESTAMP").toString()); + if (rs.getTimestamp("RECEIVED_TIMESTAMP") == null) { + operation.setReceivedTimeStamp(""); + } else { + operation.setReceivedTimeStamp(rs.getTimestamp("RECEIVED_TIMESTAMP").toString()); + } + operation.setCode(rs.getString("OPERATION_CODE")); + operation.setStatus(Operation.Status.valueOf(rs.getString("STATUS"))); + operations.add(operation); + } + } catch (SQLException e) { + throw new OperationManagementDAOException("SQL error occurred while retrieving the operation " + + "available for the device'" + enrolmentId + "' with status '", e); + } finally { + OperationManagementDAOUtil.cleanupResources(stmt, rs); + } + return operations; + } + + @Override + public int getOperationCountForDevice(int enrolmentId) throws OperationManagementDAOException { + Connection conn; + PreparedStatement stmt = null; + ResultSet rs = null; + int operationCount = 0; + try { + conn = OperationManagementDAOFactory.getConnection(); + String sql = "SELECT COUNT(ID) AS OPERATION_COUNT FROM DM_ENROLMENT_OP_MAPPING WHERE ENROLMENT_ID = ?"; + stmt = conn.prepareStatement(sql); + stmt.setInt(1, enrolmentId); + rs = stmt.executeQuery(); + if (rs.next()) { + operationCount = rs.getInt("OPERATION_COUNT"); + } + } catch (SQLException e) { + throw new OperationManagementDAOException("Error occurred while getting the operations count for enrolment : " + + enrolmentId, e); + } finally { + OperationManagementDAOUtil.cleanupResources(stmt, rs); + } + return operationCount; + } + @Override public Operation getNextOperation(int enrolmentId) throws OperationManagementDAOException { PreparedStatement stmt = null; diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/operation/mgt/dao/impl/PolicyOperationDAOImpl.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/operation/mgt/dao/impl/PolicyOperationDAOImpl.java index 6b2a848809e..957f206f3aa 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/operation/mgt/dao/impl/PolicyOperationDAOImpl.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/operation/mgt/dao/impl/PolicyOperationDAOImpl.java @@ -31,7 +31,7 @@ import java.sql.*; import java.util.ArrayList; import java.util.List; -public class PolicyOperationDAOImpl extends OperationDAOImpl { +public class PolicyOperationDAOImpl extends GenericOperationDAOImpl { private static final Log log = LogFactory.getLog(PolicyOperationDAOImpl.class); diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/operation/mgt/dao/impl/ProfileOperationDAOImpl.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/operation/mgt/dao/impl/ProfileOperationDAOImpl.java index a82e7c5e5f4..4cc496c853c 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/operation/mgt/dao/impl/ProfileOperationDAOImpl.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/operation/mgt/dao/impl/ProfileOperationDAOImpl.java @@ -31,7 +31,7 @@ import java.sql.*; import java.util.ArrayList; import java.util.List; -public class ProfileOperationDAOImpl extends OperationDAOImpl { +public class ProfileOperationDAOImpl extends GenericOperationDAOImpl { private static final Log log = LogFactory.getLog(ProfileOperationDAOImpl.class); diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/operation/mgt/dao/impl/operation/OracleOperationDAOImpl.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/operation/mgt/dao/impl/operation/OracleOperationDAOImpl.java new file mode 100644 index 00000000000..eb16c2feda1 --- /dev/null +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/operation/mgt/dao/impl/operation/OracleOperationDAOImpl.java @@ -0,0 +1,126 @@ +/* + * Copyright (c) 2015, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. 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 org.wso2.carbon.device.mgt.core.operation.mgt.dao.impl.operation; + +import org.wso2.carbon.device.mgt.core.dto.operation.mgt.Operation; +import org.wso2.carbon.device.mgt.core.operation.mgt.dao.OperationManagementDAOException; +import org.wso2.carbon.device.mgt.core.operation.mgt.dao.OperationManagementDAOFactory; +import org.wso2.carbon.device.mgt.core.operation.mgt.dao.OperationManagementDAOUtil; +import org.wso2.carbon.device.mgt.core.operation.mgt.dao.impl.GenericOperationDAOImpl; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; + +/** + * This class holds the implementation of OperationDAO which can be used to support Oracle db syntax. + */ +public class OracleOperationDAOImpl extends GenericOperationDAOImpl { + + @Override + public List getOperationsForDevice(int enrolmentId, int index, int limit) + throws OperationManagementDAOException { + PreparedStatement stmt = null; + ResultSet rs = null; + Operation operation; + List operations = new ArrayList(); + try { + Connection conn = OperationManagementDAOFactory.getConnection(); + String sql = "SELECT o.ID, TYPE, CREATED_TIMESTAMP, RECEIVED_TIMESTAMP, " + + "OPERATION_CODE, om.STATUS FROM DM_OPERATION o " + + "INNER JOIN (SELECT * FROM DM_ENROLMENT_OP_MAPPING dm " + + "WHERE dm.ENROLMENT_ID = ?) om ON o.ID = om.OPERATION_ID ORDER BY o.CREATED_TIMESTAMP DESC " + + "OFFSET ? ROWS FETCH NEXT ? ROWS ONLY"; + stmt = conn.prepareStatement(sql); + stmt.setInt(1, enrolmentId); + stmt.setInt(2, index); + stmt.setInt(3, limit); + rs = stmt.executeQuery(); + + while (rs.next()) { + operation = new Operation(); + operation.setId(rs.getInt("ID")); + operation.setType(Operation.Type.valueOf(rs.getString("TYPE"))); + operation.setCreatedTimeStamp(rs.getTimestamp("CREATED_TIMESTAMP").toString()); + if (rs.getTimestamp("RECEIVED_TIMESTAMP") == null) { + operation.setReceivedTimeStamp(""); + } else { + operation.setReceivedTimeStamp(rs.getTimestamp("RECEIVED_TIMESTAMP").toString()); + } + operation.setCode(rs.getString("OPERATION_CODE")); + operation.setStatus(Operation.Status.valueOf(rs.getString("STATUS"))); + operations.add(operation); + } + } catch (SQLException e) { + throw new OperationManagementDAOException("SQL error occurred while retrieving the operation " + + "available for the device'" + enrolmentId + "' with status '", e); + } finally { + OperationManagementDAOUtil.cleanupResources(stmt, rs); + } + return operations; + } + + @Override + public List getOperationsByDeviceAndStatus(int enrolmentId, int index, int limit, + Operation.Status status) + throws OperationManagementDAOException { + PreparedStatement stmt = null; + ResultSet rs = null; + Operation operation; + List operations = new ArrayList(); + try { + Connection conn = OperationManagementDAOFactory.getConnection(); + String sql = "SELECT o.ID, TYPE, CREATED_TIMESTAMP, RECEIVED_TIMESTAMP, OPERATION_CODE " + + "FROM DM_OPERATION o " + + "INNER JOIN (SELECT * FROM DM_ENROLMENT_OP_MAPPING dm " + + "WHERE dm.ENROLMENT_ID = ? AND dm.STATUS = ?) om ON o.ID = om.OPERATION_ID ORDER BY " + + "o.CREATED_TIMESTAMP DESC OFFSET ? ROWS FETCH NEXT ? ROWS ONLY"; + stmt = conn.prepareStatement(sql); + stmt.setInt(1, enrolmentId); + stmt.setString(2, status.toString()); + stmt.setInt(3, index); + stmt.setInt(4, limit); + rs = stmt.executeQuery(); + + while (rs.next()) { + operation = new Operation(); + operation.setId(rs.getInt("ID")); + operation.setType(Operation.Type.valueOf(rs.getString("TYPE"))); + operation.setCreatedTimeStamp(rs.getTimestamp("CREATED_TIMESTAMP").toString()); + if (rs.getTimestamp("RECEIVED_TIMESTAMP") == null) { + operation.setReceivedTimeStamp(""); + } else { + operation.setReceivedTimeStamp(rs.getTimestamp("RECEIVED_TIMESTAMP").toString()); + } + operation.setCode(rs.getString("OPERATION_CODE")); + operation.setStatus(status); + operations.add(operation); + } + } catch (SQLException e) { + throw new OperationManagementDAOException("SQL error occurred while retrieving the operation " + + "available for the device'" + enrolmentId + "' with status '" + status.toString(), e); + } finally { + OperationManagementDAOUtil.cleanupResources(stmt, rs); + } + return operations; + } +} \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/operation/mgt/dao/impl/operation/PostgreSQLOperationDAOImpl.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/operation/mgt/dao/impl/operation/PostgreSQLOperationDAOImpl.java new file mode 100644 index 00000000000..192ee388b8e --- /dev/null +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/operation/mgt/dao/impl/operation/PostgreSQLOperationDAOImpl.java @@ -0,0 +1,125 @@ +/* + * Copyright (c) 2015, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. 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 org.wso2.carbon.device.mgt.core.operation.mgt.dao.impl.operation; + +import org.wso2.carbon.device.mgt.core.dto.operation.mgt.Operation; +import org.wso2.carbon.device.mgt.core.operation.mgt.dao.OperationManagementDAOException; +import org.wso2.carbon.device.mgt.core.operation.mgt.dao.OperationManagementDAOFactory; +import org.wso2.carbon.device.mgt.core.operation.mgt.dao.OperationManagementDAOUtil; +import org.wso2.carbon.device.mgt.core.operation.mgt.dao.impl.GenericOperationDAOImpl; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; + +/** + * This class holds the implementation of OperationDAO which can be used to support PostgreSQL db syntax. + */ +public class PostgreSQLOperationDAOImpl extends GenericOperationDAOImpl { + + @Override + public List getOperationsForDevice(int enrolmentId, int index, int limit) + throws OperationManagementDAOException { + PreparedStatement stmt = null; + ResultSet rs = null; + Operation operation; + List operations = new ArrayList(); + try { + Connection conn = OperationManagementDAOFactory.getConnection(); + String sql = "SELECT o.ID, TYPE, CREATED_TIMESTAMP, RECEIVED_TIMESTAMP, " + + "OPERATION_CODE, om.STATUS FROM DM_OPERATION o " + + "INNER JOIN (SELECT * FROM DM_ENROLMENT_OP_MAPPING dm " + + "WHERE dm.ENROLMENT_ID = ?) om ON o.ID = om.OPERATION_ID ORDER BY o.CREATED_TIMESTAMP DESC LIMIT ? OFFSET ?"; + stmt = conn.prepareStatement(sql); + stmt.setInt(1, enrolmentId); + stmt.setInt(2, limit); + stmt.setInt(3, index); + rs = stmt.executeQuery(); + + while (rs.next()) { + operation = new Operation(); + operation.setId(rs.getInt("ID")); + operation.setType(Operation.Type.valueOf(rs.getString("TYPE"))); + operation.setCreatedTimeStamp(rs.getTimestamp("CREATED_TIMESTAMP").toString()); + if (rs.getTimestamp("RECEIVED_TIMESTAMP") == null) { + operation.setReceivedTimeStamp(""); + } else { + operation.setReceivedTimeStamp(rs.getTimestamp("RECEIVED_TIMESTAMP").toString()); + } + operation.setCode(rs.getString("OPERATION_CODE")); + operation.setStatus(Operation.Status.valueOf(rs.getString("STATUS"))); + operations.add(operation); + } + } catch (SQLException e) { + throw new OperationManagementDAOException("SQL error occurred while retrieving the operation " + + "available for the device'" + enrolmentId + "' with status '", e); + } finally { + OperationManagementDAOUtil.cleanupResources(stmt, rs); + } + return operations; + } + + @Override + public List getOperationsByDeviceAndStatus(int enrolmentId, int index, int limit, + Operation.Status status) + throws OperationManagementDAOException { + PreparedStatement stmt = null; + ResultSet rs = null; + Operation operation; + List operations = new ArrayList(); + try { + Connection conn = OperationManagementDAOFactory.getConnection(); + String sql = "SELECT o.ID, TYPE, CREATED_TIMESTAMP, RECEIVED_TIMESTAMP, OPERATION_CODE " + + "FROM DM_OPERATION o " + + "INNER JOIN (SELECT * FROM DM_ENROLMENT_OP_MAPPING dm " + + "WHERE dm.ENROLMENT_ID = ? AND dm.STATUS = ?) om ON o.ID = om.OPERATION_ID ORDER BY " + + "o.CREATED_TIMESTAMP DESC LIMIT ? OFFSET ?"; + stmt = conn.prepareStatement(sql); + stmt.setInt(1, enrolmentId); + stmt.setString(2, status.toString()); + stmt.setInt(3, limit); + stmt.setInt(4, index); + rs = stmt.executeQuery(); + + while (rs.next()) { + operation = new Operation(); + operation.setId(rs.getInt("ID")); + operation.setType(Operation.Type.valueOf(rs.getString("TYPE"))); + operation.setCreatedTimeStamp(rs.getTimestamp("CREATED_TIMESTAMP").toString()); + if (rs.getTimestamp("RECEIVED_TIMESTAMP") == null) { + operation.setReceivedTimeStamp(""); + } else { + operation.setReceivedTimeStamp(rs.getTimestamp("RECEIVED_TIMESTAMP").toString()); + } + operation.setCode(rs.getString("OPERATION_CODE")); + operation.setStatus(status); + operations.add(operation); + } + } catch (SQLException e) { + throw new OperationManagementDAOException("SQL error occurred while retrieving the operation " + + "available for the device'" + enrolmentId + "' with status '" + status.toString(), e); + } finally { + OperationManagementDAOUtil.cleanupResources(stmt, rs); + } + return operations; + } +} diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/operation/mgt/dao/impl/operation/SQLServerOperationDAOImpl.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/operation/mgt/dao/impl/operation/SQLServerOperationDAOImpl.java new file mode 100644 index 00000000000..5849e8b0a10 --- /dev/null +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/operation/mgt/dao/impl/operation/SQLServerOperationDAOImpl.java @@ -0,0 +1,127 @@ +/* + * Copyright (c) 2015, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. 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 org.wso2.carbon.device.mgt.core.operation.mgt.dao.impl.operation; + +import org.wso2.carbon.device.mgt.common.PaginationResult; +import org.wso2.carbon.device.mgt.core.dto.operation.mgt.Operation; +import org.wso2.carbon.device.mgt.core.operation.mgt.dao.OperationManagementDAOException; +import org.wso2.carbon.device.mgt.core.operation.mgt.dao.OperationManagementDAOFactory; +import org.wso2.carbon.device.mgt.core.operation.mgt.dao.OperationManagementDAOUtil; +import org.wso2.carbon.device.mgt.core.operation.mgt.dao.impl.GenericOperationDAOImpl; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; + +/** + * This class holds the implementation of OperationDAO which can be used to support SQLServer db syntax. + */ +public class SQLServerOperationDAOImpl extends GenericOperationDAOImpl { + + @Override + public List getOperationsForDevice(int enrolmentId, int index, int limit) + throws OperationManagementDAOException { + PreparedStatement stmt = null; + ResultSet rs = null; + Operation operation; + List operations = new ArrayList(); + try { + Connection conn = OperationManagementDAOFactory.getConnection(); + String sql = "SELECT o.ID, TYPE, CREATED_TIMESTAMP, RECEIVED_TIMESTAMP, " + + "OPERATION_CODE, om.STATUS FROM DM_OPERATION o " + + "INNER JOIN (SELECT * FROM DM_ENROLMENT_OP_MAPPING dm " + + "WHERE dm.ENROLMENT_ID = ?) om ON o.ID = om.OPERATION_ID ORDER BY o.CREATED_TIMESTAMP DESC " + + "OFFSET ? ROWS FETCH NEXT ? ROWS ONLY"; + stmt = conn.prepareStatement(sql); + stmt.setInt(1, enrolmentId); + stmt.setInt(2, index); + stmt.setInt(3, limit); + rs = stmt.executeQuery(); + + while (rs.next()) { + operation = new Operation(); + operation.setId(rs.getInt("ID")); + operation.setType(Operation.Type.valueOf(rs.getString("TYPE"))); + operation.setCreatedTimeStamp(rs.getTimestamp("CREATED_TIMESTAMP").toString()); + if (rs.getTimestamp("RECEIVED_TIMESTAMP") == null) { + operation.setReceivedTimeStamp(""); + } else { + operation.setReceivedTimeStamp(rs.getTimestamp("RECEIVED_TIMESTAMP").toString()); + } + operation.setCode(rs.getString("OPERATION_CODE")); + operation.setStatus(Operation.Status.valueOf(rs.getString("STATUS"))); + operations.add(operation); + } + } catch (SQLException e) { + throw new OperationManagementDAOException("SQL error occurred while retrieving the operation " + + "available for the device'" + enrolmentId + "' with status '", e); + } finally { + OperationManagementDAOUtil.cleanupResources(stmt, rs); + } + return operations; + } + + @Override + public List getOperationsByDeviceAndStatus(int enrolmentId, int index, int limit, + Operation.Status status) + throws OperationManagementDAOException { + PreparedStatement stmt = null; + ResultSet rs = null; + Operation operation; + List operations = new ArrayList(); + try { + Connection conn = OperationManagementDAOFactory.getConnection(); + String sql = "SELECT o.ID, TYPE, CREATED_TIMESTAMP, RECEIVED_TIMESTAMP, OPERATION_CODE " + + "FROM DM_OPERATION o " + + "INNER JOIN (SELECT * FROM DM_ENROLMENT_OP_MAPPING dm " + + "WHERE dm.ENROLMENT_ID = ? AND dm.STATUS = ?) om ON o.ID = om.OPERATION_ID ORDER BY " + + "o.CREATED_TIMESTAMP DESC OFFSET ? ROWS FETCH NEXT ? ROWS ONLY"; + stmt = conn.prepareStatement(sql); + stmt.setInt(1, enrolmentId); + stmt.setString(2, status.toString()); + stmt.setInt(3, index); + stmt.setInt(4, limit); + rs = stmt.executeQuery(); + + while (rs.next()) { + operation = new Operation(); + operation.setId(rs.getInt("ID")); + operation.setType(Operation.Type.valueOf(rs.getString("TYPE"))); + operation.setCreatedTimeStamp(rs.getTimestamp("CREATED_TIMESTAMP").toString()); + if (rs.getTimestamp("RECEIVED_TIMESTAMP") == null) { + operation.setReceivedTimeStamp(""); + } else { + operation.setReceivedTimeStamp(rs.getTimestamp("RECEIVED_TIMESTAMP").toString()); + } + operation.setCode(rs.getString("OPERATION_CODE")); + operation.setStatus(status); + operations.add(operation); + } + } catch (SQLException e) { + throw new OperationManagementDAOException("SQL error occurred while retrieving the operation " + + "available for the device'" + enrolmentId + "' with status '" + status.toString(), e); + } finally { + OperationManagementDAOUtil.cleanupResources(stmt, rs); + } + return operations; + } +} diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/service/DeviceManagementProviderServiceImpl.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/service/DeviceManagementProviderServiceImpl.java index 649d024646c..c1bc8cfa94a 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/service/DeviceManagementProviderServiceImpl.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/service/DeviceManagementProviderServiceImpl.java @@ -861,6 +861,12 @@ public class DeviceManagementProviderServiceImpl implements DeviceManagementProv return DeviceManagementDataHolder.getInstance().getOperationManager().getOperations(deviceId); } + @Override + public PaginationResult getOperations(DeviceIdentifier deviceId, int index, int limit) + throws OperationManagementException { + return DeviceManagementDataHolder.getInstance().getOperationManager().getOperations(deviceId, index, limit); + } + @Override public List getPendingOperations(DeviceIdentifier deviceId) throws OperationManagementException { diff --git a/components/identity-extensions/dynamic-client-registration/dynamic-client-web-proxy/pom.xml b/components/identity-extensions/dynamic-client-registration/dynamic-client-web-proxy/pom.xml new file mode 100644 index 00000000000..2b03b808fb9 --- /dev/null +++ b/components/identity-extensions/dynamic-client-registration/dynamic-client-web-proxy/pom.xml @@ -0,0 +1,114 @@ + + + + + + dynamic-client-registration + org.wso2.carbon.devicemgt + 0.9.2-SNAPSHOT + ../pom.xml + + + 4.0.0 + org.wso2.mdm + dynamic-client-web-proxy + 0.9.2-SNAPSHOT + WSO2 Carbon - Proxy endpoint of Dynamic Client Registration Web Service + WSO2 Carbon - Dynamic Client Registration Web Proxy + war + + + + + maven-war-plugin + 2.2 + + ${project.artifactId} + + + + + + + org.wso2.carbon.devicemgt + org.wso2.carbon.dynamic.client.registration + provided + + + org.wso2.carbon + org.wso2.carbon.utils + provided + + + org.apache.ws.commons.axiom + axiom-api + provided + + + org.apache.ws.commons.axiom + axiom-impl + provided + + + org.apache.ws.commons.axiom.wso2 + axiom + provided + + + org.apache.cxf + cxf-rt-frontend-jaxrs + provided + + + org.apache.cxf + cxf-rt-transports-http + provided + + + org.apache.cxf + cxf-rt-bindings-http + provided + + + org.codehaus.jackson + jackson-jaxrs + + + commons-logging + commons-logging + provided + + + org.apache.httpcomponents + httpclient + + + com.google.code.gson + gson + provided + + + org.wso2.carbon + org.wso2.carbon.core + provided + + + \ No newline at end of file diff --git a/components/identity-extensions/dynamic-client-registration/dynamic-client-web-proxy/src/main/java/org/wso2/carbon/dynamic/client/web/proxy/OAuthEndpointProxy.java b/components/identity-extensions/dynamic-client-registration/dynamic-client-web-proxy/src/main/java/org/wso2/carbon/dynamic/client/web/proxy/OAuthEndpointProxy.java new file mode 100644 index 00000000000..c738d8aec12 --- /dev/null +++ b/components/identity-extensions/dynamic-client-registration/dynamic-client-web-proxy/src/main/java/org/wso2/carbon/dynamic/client/web/proxy/OAuthEndpointProxy.java @@ -0,0 +1,80 @@ +/* + * Copyright (c) 2015, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. 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 org.wso2.carbon.dynamic.client.web.proxy; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.http.HttpEntity; +import org.apache.http.HttpHost; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.utils.URIBuilder; +import org.apache.http.impl.client.DefaultHttpClient; +import org.apache.http.util.EntityUtils; +import org.wso2.carbon.dynamic.client.web.proxy.util.Constants; +import org.wso2.carbon.dynamic.client.web.proxy.util.DCRProxyUtils; + +import javax.ws.rs.Consumes; +import javax.ws.rs.POST; +import javax.ws.rs.Produces; +import javax.ws.rs.core.MultivaluedMap; +import javax.ws.rs.core.Response; +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.net.URI; +import java.net.URISyntaxException; + +public class OAuthEndpointProxy { + + private static final Log log = LogFactory.getLog(OAuthEndpointProxy.class); + + @POST + @Consumes("application/x-www-form-urlencoded") + @Produces("application/json") + public Response issueAccessToken(MultivaluedMap paramMap) { + DefaultHttpClient httpClient = DCRProxyUtils.getHttpsClient(); + String host = DCRProxyUtils.getKeyManagerHost(); + Response response; + try { + URI uri = new URIBuilder().setScheme(Constants.RemoteServiceProperties. + DYNAMIC_CLIENT_SERVICE_PROTOCOL).setHost(host).setPath( + Constants.RemoteServiceProperties.OAUTH2_TOKEN_ENDPOINT).build(); + HttpHost httpHost = new HttpHost(uri.toString()); + CloseableHttpResponse serverResponse = httpClient.execute(httpHost, null); + HttpEntity responseData = serverResponse.getEntity(); + int status = serverResponse.getStatusLine().getStatusCode(); + String resp = EntityUtils.toString(responseData, Constants.CharSets.CHARSET_UTF_8); + response = Response.status(DCRProxyUtils.getResponseStatus(status)).entity(resp).build(); + } catch (URISyntaxException e) { + String msg = "Service invoke error occurred while registering client"; + log.error(msg, e); + response = Response.status(javax.ws.rs.core.Response.Status.INTERNAL_SERVER_ERROR).entity(msg).build(); + } catch (UnsupportedEncodingException e) { + String msg = "Service invoke error occurred while registering client"; + log.error(msg, e); + response = Response.status(javax.ws.rs.core.Response.Status.INTERNAL_SERVER_ERROR).entity(msg).build(); + } catch (IOException e) { + String msg = "Service invoke error occurred while registering client"; + log.error(msg, e); + response = Response.status(javax.ws.rs.core.Response.Status.INTERNAL_SERVER_ERROR).entity(msg).build(); + } finally { + httpClient.close(); + } + return response; + } +} diff --git a/components/identity-extensions/dynamic-client-registration/dynamic-client-web-proxy/src/main/java/org/wso2/carbon/dynamic/client/web/proxy/RegistrationProxy.java b/components/identity-extensions/dynamic-client-registration/dynamic-client-web-proxy/src/main/java/org/wso2/carbon/dynamic/client/web/proxy/RegistrationProxy.java new file mode 100644 index 00000000000..885530df770 --- /dev/null +++ b/components/identity-extensions/dynamic-client-registration/dynamic-client-web-proxy/src/main/java/org/wso2/carbon/dynamic/client/web/proxy/RegistrationProxy.java @@ -0,0 +1,129 @@ +/* + * Copyright (c) 2015, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. 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 org.wso2.carbon.dynamic.client.web.proxy; + +import com.google.gson.Gson; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.http.HttpEntity; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpDelete; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.client.utils.URIBuilder; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.DefaultHttpClient; +import org.apache.http.util.EntityUtils; +import org.wso2.carbon.dynamic.client.registration.profile.RegistrationProfile; +import org.wso2.carbon.dynamic.client.web.proxy.util.Constants; +import org.wso2.carbon.dynamic.client.web.proxy.util.DCRProxyUtils; + +import javax.ws.rs.*; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.net.URI; +import java.net.URISyntaxException; + +/** + * This class implements the proxy-endpoint for Dynamic-client-registration web service endpoints. + */ +public class RegistrationProxy { + + private static final Log log = LogFactory.getLog(RegistrationProxy.class); + + @POST + @Consumes(MediaType.APPLICATION_JSON) + @Produces(MediaType.APPLICATION_JSON) + public Response register(RegistrationProfile registrationProfile) { + DefaultHttpClient httpClient = DCRProxyUtils.getHttpsClient(); + String host = DCRProxyUtils.getKeyManagerHost(); + Response response; + try { + URI uri = new URIBuilder().setScheme(Constants.RemoteServiceProperties. + DYNAMIC_CLIENT_SERVICE_PROTOCOL).setHost(host).setPath( + Constants.RemoteServiceProperties.DYNAMIC_CLIENT_SERVICE_ENDPOINT).build(); + Gson gson = new Gson(); + StringEntity entity = new StringEntity(gson.toJson(registrationProfile), MediaType.APPLICATION_JSON, + Constants.CharSets.CHARSET_UTF_8); + HttpPost httpPost = new HttpPost(uri); + httpPost.setEntity(entity); + CloseableHttpResponse serverResponse = httpClient.execute(httpPost); + HttpEntity responseData = serverResponse.getEntity(); + int status = serverResponse.getStatusLine().getStatusCode(); + String resp = EntityUtils.toString(responseData, Constants.CharSets.CHARSET_UTF_8); + response = Response.status(DCRProxyUtils.getResponseStatus(status)).entity(resp).build(); + } catch (URISyntaxException e) { + String msg = "Server error occurred while registering client '" + registrationProfile.getClientName() + "'"; + log.error(msg, e); + response = Response.status(Response.Status.BAD_REQUEST).entity(msg).build(); + } catch (UnsupportedEncodingException e) { + String msg = "Request data encoding error occurred while registering client '" + registrationProfile. + getClientName() + "'"; + log.error(msg, e); + response = Response.status(Response.Status.UNSUPPORTED_MEDIA_TYPE).entity(msg).build(); + } catch (IOException e) { + String msg = "Service invoke error occurred while registering client."; + log.error(msg, e); + response = Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(msg).build(); + } finally { + httpClient.close(); + } + return response; + } + + @DELETE + @Produces(MediaType.APPLICATION_JSON) + public Response unregister(@QueryParam("applicationName") String applicationName, + @QueryParam("userId") String userId, + @QueryParam("consumerKey") String consumerKey) { + Response response; + DefaultHttpClient httpClient = DCRProxyUtils.getHttpsClient(); + String host = DCRProxyUtils.getKeyManagerHost(); + try { + URI uri = new URIBuilder().setScheme(Constants.RemoteServiceProperties. + DYNAMIC_CLIENT_SERVICE_PROTOCOL).setHost(host).setPath( + Constants.RemoteServiceProperties.DYNAMIC_CLIENT_SERVICE_ENDPOINT) + .setParameter("applicationName", applicationName) + .setParameter("userId", userId) + .setParameter("consumerKey", consumerKey).build(); + HttpDelete httpDelete = new HttpDelete(uri); + CloseableHttpResponse serverResponse = httpClient.execute(httpDelete); + HttpEntity responseData = serverResponse.getEntity(); + int status = serverResponse.getStatusLine().getStatusCode(); + String resp = EntityUtils.toString(responseData, Constants.CharSets.CHARSET_UTF_8); + response = Response.status(DCRProxyUtils.getResponseStatus(status)).entity(resp).build(); + } catch (URISyntaxException e) { + String msg = "Server error occurred while deleting the client '" + applicationName + "'"; + log.error(msg, e); + response = Response.status(Response.Status.BAD_REQUEST).entity(msg).build(); + } catch (UnsupportedEncodingException e) { + String msg = "Request data encoding error occurred while deleting the client '" + applicationName + "'"; + log.error(msg, e); + response = Response.status(Response.Status.UNSUPPORTED_MEDIA_TYPE).entity(msg).build(); + } catch (IOException e) { + String msg = "Service invoke error occurred while deleting the client '" + applicationName + "'"; + log.error(msg, e); + response = Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(msg).build(); + } finally { + httpClient.close(); + } + return response; + } +} \ No newline at end of file diff --git a/components/identity-extensions/dynamic-client-registration/dynamic-client-web-proxy/src/main/java/org/wso2/carbon/dynamic/client/web/proxy/util/Constants.java b/components/identity-extensions/dynamic-client-registration/dynamic-client-web-proxy/src/main/java/org/wso2/carbon/dynamic/client/web/proxy/util/Constants.java new file mode 100644 index 00000000000..a63a530edb0 --- /dev/null +++ b/components/identity-extensions/dynamic-client-registration/dynamic-client-web-proxy/src/main/java/org/wso2/carbon/dynamic/client/web/proxy/util/Constants.java @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2015, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. 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 org.wso2.carbon.dynamic.client.web.proxy.util; + +/** + * Holds the constants used by DCR proxy app. + */ +public class Constants { + + public static final class CharSets { + private CharSets() { + throw new AssertionError(); + } + + public static final String CHARSET_UTF_8 = "UTF-8"; + } + + public static class ConfigurationProperties { + private ConfigurationProperties() { + throw new AssertionError(); + } + + public static final String AUTHENTICATOR_NAME = "OAuthAuthenticator"; + public static final String AUTHENTICATOR_CONFIG_HOST_URL = "hostURL"; + } + + public static class RemoteServiceProperties { + private RemoteServiceProperties() { + throw new AssertionError(); + } + + public static final String DYNAMIC_CLIENT_SERVICE_ENDPOINT = "/dynamic-client-web/register"; + public static final String OAUTH2_TOKEN_ENDPOINT = "/oauth2/token"; + public static final String DYNAMIC_CLIENT_SERVICE_PROTOCOL = "https"; + } +} diff --git a/components/identity-extensions/dynamic-client-registration/dynamic-client-web-proxy/src/main/java/org/wso2/carbon/dynamic/client/web/proxy/util/DCRProxyUtils.java b/components/identity-extensions/dynamic-client-registration/dynamic-client-web-proxy/src/main/java/org/wso2/carbon/dynamic/client/web/proxy/util/DCRProxyUtils.java new file mode 100644 index 00000000000..d9d1e549b23 --- /dev/null +++ b/components/identity-extensions/dynamic-client-registration/dynamic-client-web-proxy/src/main/java/org/wso2/carbon/dynamic/client/web/proxy/util/DCRProxyUtils.java @@ -0,0 +1,122 @@ +/* + * Copyright (c) 2015, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. 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 org.wso2.carbon.dynamic.client.web.proxy.util; + +import org.apache.http.HttpHost; +import org.apache.http.client.utils.URIBuilder; +import org.apache.http.conn.scheme.Scheme; +import org.apache.http.conn.scheme.SchemeRegistry; +import org.apache.http.conn.ssl.SSLSocketFactory; +import org.apache.http.conn.ssl.X509HostnameVerifier; +import org.apache.http.impl.client.DefaultHttpClient; +import org.apache.http.impl.conn.SingleClientConnManager; +import org.wso2.carbon.context.PrivilegedCarbonContext; +import org.wso2.carbon.core.security.AuthenticatorsConfiguration; +import org.wso2.carbon.utils.CarbonUtils; +import org.wso2.carbon.utils.ConfigurationContextService; + +import javax.net.ssl.HostnameVerifier; +import javax.net.ssl.HttpsURLConnection; +import javax.ws.rs.core.Response; + +/** + * Holds the utility methods used by DCR proxy app. + */ +public class DCRProxyUtils { + + public static ConfigurationContextService getConfigurationContextService() { + PrivilegedCarbonContext ctx = PrivilegedCarbonContext.getThreadLocalCarbonContext(); + return (ConfigurationContextService) ctx.getOSGiService(ConfigurationContextService.class, null); + } + + public static DefaultHttpClient getHttpsClient() { + DefaultHttpClient httpClient = new DefaultHttpClient(); + // Setup the HTTPS settings to accept any certificate. + HostnameVerifier hostnameVerifier = org.apache.http.conn.ssl.SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER; + + SchemeRegistry registry = new SchemeRegistry(); + SSLSocketFactory socketFactory = SSLSocketFactory.getSocketFactory(); + socketFactory.setHostnameVerifier((X509HostnameVerifier) hostnameVerifier); + registry.register(new Scheme(Constants.RemoteServiceProperties. + DYNAMIC_CLIENT_SERVICE_PROTOCOL, socketFactory, DCRProxyUtils.getServerHTTPSPort())); + SingleClientConnManager mgr = new SingleClientConnManager(httpClient.getParams(), registry); + httpClient = new DefaultHttpClient(mgr, httpClient.getParams()); + + // Set verifier + HttpsURLConnection.setDefaultHostnameVerifier(hostnameVerifier); + return httpClient; + } + + public static Response.Status getResponseStatus(int statusCode) { + switch (statusCode) { + case 200 : + return Response.Status.OK; + case 201 : + return Response.Status.CREATED; + case 400 : + return Response.Status.BAD_REQUEST; + case 415 : + return Response.Status.UNSUPPORTED_MEDIA_TYPE; + case 500 : + return Response.Status.INTERNAL_SERVER_ERROR; + } + return Response.Status.ACCEPTED; + } + + public static String getKeyManagerHost() + throws IllegalArgumentException { + AuthenticatorsConfiguration authenticatorsConfiguration = AuthenticatorsConfiguration.getInstance(); + AuthenticatorsConfiguration.AuthenticatorConfig authenticatorConfig = authenticatorsConfiguration. + getAuthenticatorConfig( + Constants.ConfigurationProperties.AUTHENTICATOR_NAME); + if (authenticatorConfig != null && authenticatorConfig.getParameters() != null) { + return getHostName(authenticatorConfig.getParameters().get(Constants.ConfigurationProperties. + AUTHENTICATOR_CONFIG_HOST_URL)); + + }else{ + throw new IllegalArgumentException("Configuration parameters need to be defined in Authenticators.xml."); + } + } + + private static String getHostName(String host) { + if (host != null && !host.isEmpty()) { + if (host.contains("https://")) { + return host.replace("https://",""); + } + } else { + throw new IllegalArgumentException("Remote Host parameter must defined in Authenticators.xml."); + } + return null; + } + + + public static int getServerHTTPSPort() { + // HTTPS port + String mgtConsoleTransport = CarbonUtils.getManagementTransport(); + ConfigurationContextService configContextService = DCRProxyUtils.getConfigurationContextService(); + int port = CarbonUtils.getTransportPort(configContextService, mgtConsoleTransport); + int httpsProxyPort = + CarbonUtils.getTransportProxyPort(configContextService.getServerConfigContext(), + mgtConsoleTransport); + if (httpsProxyPort > 0) { + port = httpsProxyPort; + } + return port; + } +} diff --git a/components/identity-extensions/dynamic-client-registration/dynamic-client-web-proxy/src/main/webapp/META-INF/webapp-classloading.xml b/components/identity-extensions/dynamic-client-registration/dynamic-client-web-proxy/src/main/webapp/META-INF/webapp-classloading.xml new file mode 100644 index 00000000000..38ac5358422 --- /dev/null +++ b/components/identity-extensions/dynamic-client-registration/dynamic-client-web-proxy/src/main/webapp/META-INF/webapp-classloading.xml @@ -0,0 +1,35 @@ + + + + + + + + + false + + + CXF,Carbon + diff --git a/components/identity-extensions/dynamic-client-registration/dynamic-client-web-proxy/src/main/webapp/WEB-INF/cxf-servlet.xml b/components/identity-extensions/dynamic-client-registration/dynamic-client-web-proxy/src/main/webapp/WEB-INF/cxf-servlet.xml new file mode 100644 index 00000000000..e057aebcd24 --- /dev/null +++ b/components/identity-extensions/dynamic-client-registration/dynamic-client-web-proxy/src/main/webapp/WEB-INF/cxf-servlet.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/components/identity-extensions/dynamic-client-registration/dynamic-client-web-proxy/src/main/webapp/WEB-INF/web.xml b/components/identity-extensions/dynamic-client-registration/dynamic-client-web-proxy/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 00000000000..091413931d0 --- /dev/null +++ b/components/identity-extensions/dynamic-client-registration/dynamic-client-web-proxy/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,37 @@ + + + + Dynamic-client-proxy-Webapp + + Dynamic-client-registration-proxy Endpoint + JAX-WS/JAX-RS Servlet + CXFServlet + + org.apache.cxf.transport.servlet.CXFServlet + + 1 + + + CXFServlet + /* + + + 60 + + \ No newline at end of file diff --git a/components/identity-extensions/dynamic-client-registration/dynamic-client-web-proxy/src/main/webapp/servicelist.css b/components/identity-extensions/dynamic-client-registration/dynamic-client-web-proxy/src/main/webapp/servicelist.css new file mode 100644 index 00000000000..e6eacadbb0e --- /dev/null +++ b/components/identity-extensions/dynamic-client-registration/dynamic-client-web-proxy/src/main/webapp/servicelist.css @@ -0,0 +1,125 @@ +@CHARSET "ISO-8859-1"; + +/* http://meyerweb.com/eric/tools/css/reset/ + v2.0 | 20110126 + License: none (public domain) +*/ + +html, body, div, span, applet, object, iframe, +h1, h2, h3, h4, h5, h6, p, blockquote, pre, +a, abbr, acronym, address, big, cite, code, +del, dfn, em, img, ins, kbd, q, s, samp, +small, strike, strong, sub, sup, tt, var, +b, u, i, center, +dl, dt, dd, ol, ul, li, +fieldset, form, label, legend, +table, caption, tbody, tfoot, thead, tr, th, td, +article, aside, canvas, details, embed, +figure, figcaption, footer, header, hgroup, +menu, nav, output, ruby, section, summary, +time, mark, audio, video { + margin: 0; + padding: 0; + border: 0; + font-size: 100%; + font: inherit; + vertical-align: baseline; +} + +/* HTML5 display-role reset for older browsers */ +article, aside, details, figcaption, figure, +footer, header, hgroup, menu, nav, section { + display: block; +} + +html { + background: #efefef; +} + +body { + line-height: 1; + width: 960px; + margin: auto; + background: white; + padding: 10px; + box-shadow: 0px 0px 5px #CCC; + font-family: "Lucida Grande", "Lucida Sans", "Microsoft Sans Serif", "Lucida Sans Unicode", "Verdana", "Sans-serif", "trebuchet ms" !important; + +} + +ol, ul { + list-style: none; +} + +blockquote, q { + quotes: none; +} + +blockquote:before, blockquote:after, +q:before, q:after { + content: ''; + content: none; +} + +table { + border-collapse: collapse; + border-spacing: 0; + width: 960px; + border: solid 1px #ccc; +} + +table a { + font-size: 12px; + color: #1e90ff; + padding: 7px; + float: left;; +} + +.heading { + font-size: 18px; + margin-top: 20px; + float: left; + color: #0067B1; + margin-bottom: 20px; + padding-top: 20px; +} + +.field { + font-weight: normal; + width: 120px; + font-size: 12px; + float: left; + padding: 7px; + clear: left; +} + +.value { + font-weight: bold; + font-size: 12px; + float: left; + padding: 7px; + clear: right; +} + +.porttypename { + font-weight: bold; + font-size: 14px; +} + +UL { + margin-top: 0; +} + +LI { + font-weight: normal; + font-size: 12px; + margin-top: 10px; +} + +TD { + border: 1px solid #ccc; + vertical-align: text-top; + padding: 5px; +} + + diff --git a/components/identity-extensions/dynamic-client-registration/dynamic-client-web-proxy/src/test/resources/log4j.properties b/components/identity-extensions/dynamic-client-registration/dynamic-client-web-proxy/src/test/resources/log4j.properties new file mode 100644 index 00000000000..7da6d6c9e12 --- /dev/null +++ b/components/identity-extensions/dynamic-client-registration/dynamic-client-web-proxy/src/test/resources/log4j.properties @@ -0,0 +1,32 @@ +# +# Copyright 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. +# + +# +# This is the log4j configuration file used by WSO2 Carbon +# +# IMPORTANT : Please do not remove or change the names of any +# of the Appenders 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/identity-extensions/dynamic-client-registration/dynamic-client-web-proxy/src/test/resources/testng.xml b/components/identity-extensions/dynamic-client-registration/dynamic-client-web-proxy/src/test/resources/testng.xml new file mode 100644 index 00000000000..c0c21a40c31 --- /dev/null +++ b/components/identity-extensions/dynamic-client-registration/dynamic-client-web-proxy/src/test/resources/testng.xml @@ -0,0 +1,23 @@ + + + + + + + \ No newline at end of file diff --git a/components/identity-extensions/dynamic-client-registration/dynamic-client-web/pom.xml b/components/identity-extensions/dynamic-client-registration/dynamic-client-web/pom.xml index 9df732403c0..1df2b45ea17 100644 --- a/components/identity-extensions/dynamic-client-registration/dynamic-client-web/pom.xml +++ b/components/identity-extensions/dynamic-client-registration/dynamic-client-web/pom.xml @@ -87,11 +87,6 @@ cxf-rt-transports-http provided - - org.apache.cxf - cxf-rt-bindings-soap - compile - org.apache.cxf cxf-rt-bindings-http diff --git a/components/identity-extensions/dynamic-client-registration/dynamic-client-web/src/main/java/org/wso2/carbon/dynamic/client/web/RegistrationService.java b/components/identity-extensions/dynamic-client-registration/dynamic-client-web/src/main/java/org/wso2/carbon/dynamic/client/web/RegistrationService.java index 194d5e966d3..ee5fa0ce744 100644 --- a/components/identity-extensions/dynamic-client-registration/dynamic-client-web/src/main/java/org/wso2/carbon/dynamic/client/web/RegistrationService.java +++ b/components/identity-extensions/dynamic-client-registration/dynamic-client-web/src/main/java/org/wso2/carbon/dynamic/client/web/RegistrationService.java @@ -27,8 +27,6 @@ import javax.ws.rs.QueryParam; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; -@Produces(MediaType.APPLICATION_JSON) -@Consumes(MediaType.APPLICATION_JSON) public interface RegistrationService { enum ErrorCode { @@ -52,6 +50,8 @@ public interface RegistrationService { * @return Status 200 if success including consumerKey and consumerSecret. */ @POST + @Produces(MediaType.APPLICATION_JSON) + @Consumes(MediaType.APPLICATION_JSON) Response register(RegistrationProfile profile); /** @@ -63,7 +63,9 @@ public interface RegistrationService { * @return Status 200 if success. */ @DELETE - public Response unregister(@QueryParam("applicationName") String applicationName, + @Produces(MediaType.APPLICATION_JSON) + @Consumes(MediaType.APPLICATION_JSON) + Response unregister(@QueryParam("applicationName") String applicationName, @QueryParam("userId") String userId, @QueryParam("consumerKey") String consumerKey); diff --git a/components/identity-extensions/dynamic-client-registration/dynamic-client-web/src/main/java/org/wso2/carbon/dynamic/client/web/impl/RegistrationServiceImpl.java b/components/identity-extensions/dynamic-client-registration/dynamic-client-web/src/main/java/org/wso2/carbon/dynamic/client/web/impl/RegistrationServiceImpl.java index 028b6df1f63..59539b7279f 100644 --- a/components/identity-extensions/dynamic-client-registration/dynamic-client-web/src/main/java/org/wso2/carbon/dynamic/client/web/impl/RegistrationServiceImpl.java +++ b/components/identity-extensions/dynamic-client-registration/dynamic-client-web/src/main/java/org/wso2/carbon/dynamic/client/web/impl/RegistrationServiceImpl.java @@ -37,8 +37,6 @@ import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import javax.ws.rs.QueryParam; -@Produces(MediaType.APPLICATION_JSON) -@Consumes(MediaType.APPLICATION_JSON) public class RegistrationServiceImpl implements RegistrationService { private static final Log log = LogFactory.getLog(RegistrationServiceImpl.class); diff --git a/components/identity-extensions/dynamic-client-registration/dynamic-client-web/src/main/webapp/WEB-INF/web.xml b/components/identity-extensions/dynamic-client-registration/dynamic-client-web/src/main/webapp/WEB-INF/web.xml index a89397675ad..57eb77536b3 100644 --- a/components/identity-extensions/dynamic-client-registration/dynamic-client-web/src/main/webapp/WEB-INF/web.xml +++ b/components/identity-extensions/dynamic-client-registration/dynamic-client-web/src/main/webapp/WEB-INF/web.xml @@ -19,9 +19,9 @@ ~ */ --> - Admin-Webapp + dynamic-client-registration-Webapp - JAX-WS/JAX-RS Device Registration Agent Endpoint + Dynamic-client-registration Agent Endpoint JAX-WS/JAX-RS Servlet CXFServlet diff --git a/components/identity-extensions/dynamic-client-registration/dynamic-client-web/src/test/resources/testng.xml b/components/identity-extensions/dynamic-client-registration/dynamic-client-web/src/test/resources/testng.xml index de65e3005d8..c25631e70a1 100644 --- a/components/identity-extensions/dynamic-client-registration/dynamic-client-web/src/test/resources/testng.xml +++ b/components/identity-extensions/dynamic-client-registration/dynamic-client-web/src/test/resources/testng.xml @@ -18,11 +18,6 @@ - + - - - - - \ No newline at end of file diff --git a/components/identity-extensions/dynamic-client-registration/org.wso2.carbon.dynamic.client.web.app.registration/src/main/java/org/wso2/carbon/dynamic/client/web/app/registration/util/DynamicClientWebAppRegistrationConstants.java b/components/identity-extensions/dynamic-client-registration/org.wso2.carbon.dynamic.client.web.app.registration/src/main/java/org/wso2/carbon/dynamic/client/web/app/registration/util/DynamicClientWebAppRegistrationConstants.java index 12697ceb316..ca5e9a0eb60 100644 --- a/components/identity-extensions/dynamic-client-registration/org.wso2.carbon.dynamic.client.web.app.registration/src/main/java/org/wso2/carbon/dynamic/client/web/app/registration/util/DynamicClientWebAppRegistrationConstants.java +++ b/components/identity-extensions/dynamic-client-registration/org.wso2.carbon.dynamic.client.web.app.registration/src/main/java/org/wso2/carbon/dynamic/client/web/app/registration/util/DynamicClientWebAppRegistrationConstants.java @@ -36,7 +36,8 @@ public class DynamicClientWebAppRegistrationConstants { } public static final String CONTENT_TYPE_ANY = "*/*"; - public static final String MEDIA_TYPE_XML = "application/xml"; + public static final String CONTENT_TYPE_XML = "application/xml"; + public static final String CONTENT_TYPE_APPLICATION_JSON = "application/json"; } public static final class CharSets { diff --git a/components/identity-extensions/dynamic-client-registration/org.wso2.carbon.dynamic.client.web.app.registration/src/main/java/org/wso2/carbon/dynamic/client/web/app/registration/util/DynamicClientWebAppRegistrationUtil.java b/components/identity-extensions/dynamic-client-registration/org.wso2.carbon.dynamic.client.web.app.registration/src/main/java/org/wso2/carbon/dynamic/client/web/app/registration/util/DynamicClientWebAppRegistrationUtil.java index 23729976558..ce6eaa50ee0 100644 --- a/components/identity-extensions/dynamic-client-registration/org.wso2.carbon.dynamic.client.web.app.registration/src/main/java/org/wso2/carbon/dynamic/client/web/app/registration/util/DynamicClientWebAppRegistrationUtil.java +++ b/components/identity-extensions/dynamic-client-registration/org.wso2.carbon.dynamic.client.web.app.registration/src/main/java/org/wso2/carbon/dynamic/client/web/app/registration/util/DynamicClientWebAppRegistrationUtil.java @@ -117,7 +117,7 @@ public class DynamicClientWebAppRegistrationUtil { Resource resource = DynamicClientWebAppRegistrationUtil.getGovernanceRegistry().newResource(); resource.setContent(writer.toString()); - resource.setMediaType(DynamicClientWebAppRegistrationConstants.ContentTypes.MEDIA_TYPE_XML); + resource.setMediaType(DynamicClientWebAppRegistrationConstants.ContentTypes.CONTENT_TYPE_XML); String resourcePath = DynamicClientWebAppRegistrationConstants.OAUTH_APP_DATA_REGISTRY_PATH + "/" + oAuthAppDetails.getClientName(); status = DynamicClientWebAppRegistrationUtil.putRegistryResource(resourcePath, resource); diff --git a/components/identity-extensions/dynamic-client-registration/org.wso2.carbon.dynamic.client.web.app.registration/src/main/java/org/wso2/carbon/dynamic/client/web/app/registration/util/RemoteDCRClient.java b/components/identity-extensions/dynamic-client-registration/org.wso2.carbon.dynamic.client.web.app.registration/src/main/java/org/wso2/carbon/dynamic/client/web/app/registration/util/RemoteDCRClient.java index 120b2f056fb..9d5926db77b 100644 --- a/components/identity-extensions/dynamic-client-registration/org.wso2.carbon.dynamic.client.web.app.registration/src/main/java/org/wso2/carbon/dynamic/client/web/app/registration/util/RemoteDCRClient.java +++ b/components/identity-extensions/dynamic-client-registration/org.wso2.carbon.dynamic.client.web.app.registration/src/main/java/org/wso2/carbon/dynamic/client/web/app/registration/util/RemoteDCRClient.java @@ -21,6 +21,8 @@ package org.wso2.carbon.dynamic.client.web.app.registration.util; import com.google.gson.Gson; import com.google.gson.JsonElement; import com.google.gson.JsonObject; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.client.methods.HttpDelete; @@ -54,42 +56,35 @@ import java.net.URISyntaxException; */ public class RemoteDCRClient { - private static final String CONTENT_TYPE_APPLICATION_JSON = "application/json"; - private static final String CHARSET_UTF_8 = "UTF-8"; + private static final Log log = LogFactory.getLog(RemoteDCRClient.class); public static OAuthApplicationInfo createOAuthApplication(RegistrationProfile registrationProfile, String host) throws DynamicClientRegistrationException { - DefaultHttpClient httpClient = new DefaultHttpClient(); + if (log.isDebugEnabled()) { + log.debug("Invoking DCR service to create OAuth application for web app : " + registrationProfile. + getClientName()); + } + DefaultHttpClient httpClient = getHTTPSClient(); String clientName = registrationProfile.getClientName(); try { - // Setup the HTTPS settings to accept any certificate. - HostnameVerifier hostnameVerifier = org.apache.http.conn.ssl.SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER; - - SchemeRegistry registry = new SchemeRegistry(); - SSLSocketFactory socketFactory = SSLSocketFactory.getSocketFactory(); - socketFactory.setHostnameVerifier((X509HostnameVerifier) hostnameVerifier); - registry.register(new Scheme(DynamicClientWebAppRegistrationConstants.RemoteServiceProperties. - DYNAMIC_CLIENT_SERVICE_PROTOCOL, socketFactory, getServerHTTPSPort())); - SingleClientConnManager mgr = new SingleClientConnManager(httpClient.getParams(), registry); - httpClient = new DefaultHttpClient(mgr, httpClient.getParams()); - - // Set verifier - HttpsURLConnection.setDefaultHostnameVerifier(hostnameVerifier); - URI uri = new URIBuilder().setScheme(DynamicClientWebAppRegistrationConstants.RemoteServiceProperties. DYNAMIC_CLIENT_SERVICE_PROTOCOL).setHost(host).setPath( - DynamicClientWebAppRegistrationConstants.RemoteServiceProperties.DYNAMIC_CLIENT_SERVICE_ENDPOINT).build(); + DynamicClientWebAppRegistrationConstants.RemoteServiceProperties.DYNAMIC_CLIENT_SERVICE_ENDPOINT) + .build(); Gson gson = new Gson(); - StringEntity entity = new StringEntity(gson.toJson(registrationProfile), CONTENT_TYPE_APPLICATION_JSON, - CHARSET_UTF_8); + StringEntity entity = new StringEntity(gson.toJson(registrationProfile), + DynamicClientWebAppRegistrationConstants.ContentTypes.CONTENT_TYPE_APPLICATION_JSON, + DynamicClientWebAppRegistrationConstants.CharSets.CHARSET_UTF8); HttpPost httpPost = new HttpPost(uri); httpPost.setEntity(entity); HttpResponse response = httpClient.execute(httpPost); int status = response.getStatusLine().getStatusCode(); - HttpEntity responseData = response.getEntity(); - String responseString = EntityUtils.toString(responseData, CHARSET_UTF_8); + HttpEntity responseData = response.getEntity(); + String responseString = EntityUtils.toString(responseData, DynamicClientWebAppRegistrationConstants. + CharSets.CHARSET_UTF8); if (status != 201) { - throw new DynamicClientRegistrationException("Backend server error occurred while invoking DCR endpoint for " + + throw new DynamicClientRegistrationException( + "Backend server error occurred while invoking DCR endpoint for " + "registering service-provider for web-app : " + clientName); } return getOAuthApplicationInfo(gson.fromJson(responseString, JsonElement.class)); @@ -98,39 +93,32 @@ public class RemoteDCRClient { "DCR endpoint for registering service-provider for web-app : " + clientName, e); } catch (UnsupportedEncodingException e) { - throw new DynamicClientRegistrationException("Exception occurred while constructing the payload for invoking " + - "DCR endpoint for registering service-provider for web-app : " - + clientName, e); + throw new DynamicClientRegistrationException( + "Exception occurred while constructing the payload for invoking " + + "DCR endpoint for registering service-provider for web-app : " + + clientName, e); } catch (IOException e) { throw new DynamicClientRegistrationException("Connection error occurred while invoking DCR endpoint for" + - " registering service-provider for web-app : " + clientName, e); + " registering service-provider for web-app : " + clientName, + e); + } finally { + httpClient.close(); } } public static boolean deleteOAuthApplication(String user, String appName, String clientid, String host) throws DynamicClientRegistrationException { - DefaultHttpClient httpClient = new DefaultHttpClient(); + if (log.isDebugEnabled()) { + log.debug("Invoking DCR service to remove OAuth application created for web app : " + appName); + } + DefaultHttpClient httpClient = getHTTPSClient(); try { - // Setup the HTTPS settings to accept any certificate. - HostnameVerifier hostnameVerifier = org.apache.http.conn.ssl.SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER; - - SchemeRegistry registry = new SchemeRegistry(); - SSLSocketFactory socketFactory = SSLSocketFactory.getSocketFactory(); - socketFactory.setHostnameVerifier((X509HostnameVerifier) hostnameVerifier); - registry.register(new Scheme(DynamicClientWebAppRegistrationConstants.RemoteServiceProperties. - DYNAMIC_CLIENT_SERVICE_PROTOCOL, socketFactory, getServerHTTPSPort())); - SingleClientConnManager mgr = new SingleClientConnManager(httpClient.getParams(), registry); - httpClient = new DefaultHttpClient(mgr, httpClient.getParams()); - - // Set verifier - HttpsURLConnection.setDefaultHostnameVerifier(hostnameVerifier); - - URI uri = new URIBuilder().setScheme(DynamicClientWebAppRegistrationConstants.RemoteServiceProperties. - DYNAMIC_CLIENT_SERVICE_PROTOCOL).setHost(host).setPath( - DynamicClientWebAppRegistrationConstants.RemoteServiceProperties.DYNAMIC_CLIENT_SERVICE_ENDPOINT) - .setParameter("applicationName", appName) - .setParameter("userId", user) - .setParameter("consumerKey", clientid).build(); + URI uri = new URIBuilder().setScheme(DynamicClientWebAppRegistrationConstants.RemoteServiceProperties. + DYNAMIC_CLIENT_SERVICE_PROTOCOL).setHost(host).setPath( + DynamicClientWebAppRegistrationConstants.RemoteServiceProperties.DYNAMIC_CLIENT_SERVICE_ENDPOINT) + .setParameter("applicationName", appName) + .setParameter("userId", user) + .setParameter("consumerKey", clientid).build(); HttpDelete httpDelete = new HttpDelete(uri); HttpResponse response = httpClient.execute(httpDelete); int status = response.getStatusLine().getStatusCode(); @@ -138,11 +126,14 @@ public class RemoteDCRClient { return true; } } catch (IOException e) { - throw new DynamicClientRegistrationException("Connection error occurred while constructing the payload for " + - "invoking DCR endpoint for unregistering the web-app : " + appName, e); + throw new DynamicClientRegistrationException( + "Connection error occurred while constructing the payload for " + + "invoking DCR endpoint for unregistering the web-app : " + appName, e); } catch (URISyntaxException e) { throw new DynamicClientRegistrationException("Exception occurred while constructing the URI for invoking " + "DCR endpoint for unregistering the web-app : " + appName, e); + } finally { + httpClient.close(); } return false; } @@ -159,7 +150,7 @@ public class RemoteDCRClient { if (httpsProxyPort > 0) { port = httpsProxyPort; } - return port; + return port; } private static OAuthApplicationInfo getOAuthApplicationInfo(JsonElement jsonData) { @@ -179,4 +170,22 @@ public class RemoteDCRClient { } return oAuthApplicationInfo; } + + private static DefaultHttpClient getHTTPSClient() { + DefaultHttpClient httpClient = new DefaultHttpClient(); + // Setup the HTTPS settings to accept any certificate. + HostnameVerifier hostnameVerifier = org.apache.http.conn.ssl.SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER; + + SchemeRegistry registry = new SchemeRegistry(); + SSLSocketFactory socketFactory = SSLSocketFactory.getSocketFactory(); + socketFactory.setHostnameVerifier((X509HostnameVerifier) hostnameVerifier); + registry.register(new Scheme(DynamicClientWebAppRegistrationConstants.RemoteServiceProperties. + DYNAMIC_CLIENT_SERVICE_PROTOCOL, socketFactory, getServerHTTPSPort())); + SingleClientConnManager mgr = new SingleClientConnManager(httpClient.getParams(), registry); + httpClient = new DefaultHttpClient(mgr, httpClient.getParams()); + + // Set verifier + HttpsURLConnection.setDefaultHostnameVerifier(hostnameVerifier); + return httpClient; + } } diff --git a/components/identity-extensions/dynamic-client-registration/pom.xml b/components/identity-extensions/dynamic-client-registration/pom.xml index e568ea5e88d..54e68022ac6 100644 --- a/components/identity-extensions/dynamic-client-registration/pom.xml +++ b/components/identity-extensions/dynamic-client-registration/pom.xml @@ -36,6 +36,7 @@ dynamic-client-web + dynamic-client-web-proxy org.wso2.carbon.dynamic.client.registration org.wso2.carbon.dynamic.client.web.app.registration diff --git a/components/policy-mgt/org.wso2.carbon.policy.mgt.core/src/main/java/org/wso2/carbon/policy/mgt/core/mgt/impl/MonitoringManagerImpl.java b/components/policy-mgt/org.wso2.carbon.policy.mgt.core/src/main/java/org/wso2/carbon/policy/mgt/core/mgt/impl/MonitoringManagerImpl.java index 1eb91150b80..f4c83d990fb 100644 --- a/components/policy-mgt/org.wso2.carbon.policy.mgt.core/src/main/java/org/wso2/carbon/policy/mgt/core/mgt/impl/MonitoringManagerImpl.java +++ b/components/policy-mgt/org.wso2.carbon.policy.mgt.core/src/main/java/org/wso2/carbon/policy/mgt/core/mgt/impl/MonitoringManagerImpl.java @@ -106,6 +106,9 @@ public class MonitoringManagerImpl implements MonitoringManager { complianceData.setPolicyId(policy.getId()); } catch (SQLException e) { throw new PolicyComplianceException("Error occurred while opening a data source connection", e); + } catch (MonitoringDAOException e) { + throw new PolicyComplianceException("Unable to add the none compliance features to database for device " + + deviceIdentifier.getId() + " - " + deviceIdentifier.getType(), e); } finally { PolicyManagementDAOFactory.closeConnection(); } @@ -120,10 +123,15 @@ public class MonitoringManagerImpl implements MonitoringManager { if (log.isDebugEnabled()) { log.debug("Compliance status primary key " + complianceData.getId()); } + monitoringDAO.deleteNoneComplianceData(complianceData.getId()); monitoringDAO.addNonComplianceFeatures(complianceData.getId(), device.getId(), complianceFeatures); PolicyManagementDAOFactory.commitTransaction(); + } catch (MonitoringDAOException e) { + PolicyManagementDAOFactory.rollbackTransaction(); + throw new PolicyComplianceException("Unable to add the none compliance features to database for device " + + deviceIdentifier.getId() + " - " + deviceIdentifier.getType(), e); } finally { PolicyManagementDAOFactory.closeConnection(); } @@ -143,6 +151,10 @@ public class MonitoringManagerImpl implements MonitoringManager { .getId()); monitoringDAO.deleteNoneComplianceData(complianceData.getId()); PolicyManagementDAOFactory.commitTransaction(); + } catch (MonitoringDAOException e) { + PolicyManagementDAOFactory.rollbackTransaction(); + throw new PolicyComplianceException("Unable to remove the none compliance features from database for device " + + deviceIdentifier.getId() + " - " + deviceIdentifier.getType(), e); } finally { PolicyManagementDAOFactory.closeConnection(); } @@ -153,17 +165,11 @@ public class MonitoringManagerImpl implements MonitoringManager { } } } catch (DeviceManagementException e) { - PolicyManagementDAOFactory.rollbackTransaction(); throw new PolicyComplianceException("Unable tor retrieve device data from DB for " + deviceIdentifier.getId() + " - " + deviceIdentifier.getType(), e); } catch (PolicyManagerDAOException | PolicyManagementException e) { - PolicyManagementDAOFactory.rollbackTransaction(); throw new PolicyComplianceException("Unable tor retrieve policy data from DB for device " + deviceIdentifier.getId() + " - " + deviceIdentifier.getType(), e); - } catch (MonitoringDAOException e) { - PolicyManagementDAOFactory.rollbackTransaction(); - throw new PolicyComplianceException("Unable to add the none compliance features to database for device " + - deviceIdentifier.getId() + " - " + deviceIdentifier.getType(), e); } return complianceFeatures; } diff --git a/components/webapp-authenticator-framework/org.wso2.carbon.webapp.authenticator.framework/src/main/java/org/wso2/carbon/webapp/authenticator/framework/authenticator/OAuthAuthenticator.java b/components/webapp-authenticator-framework/org.wso2.carbon.webapp.authenticator.framework/src/main/java/org/wso2/carbon/webapp/authenticator/framework/authenticator/OAuthAuthenticator.java index 497fa3b3e2d..c82a57646b5 100644 --- a/components/webapp-authenticator-framework/org.wso2.carbon.webapp.authenticator.framework/src/main/java/org/wso2/carbon/webapp/authenticator/framework/authenticator/OAuthAuthenticator.java +++ b/components/webapp-authenticator-framework/org.wso2.carbon.webapp.authenticator.framework/src/main/java/org/wso2/carbon/webapp/authenticator/framework/authenticator/OAuthAuthenticator.java @@ -99,13 +99,14 @@ public class OAuthAuthenticator implements WebappAuthenticator { if (oAuthValidationResponse.isValid()) { String username = oAuthValidationResponse.getUserName(); + String tenantDomain = oAuthValidationResponse.getTenantDomain(); //Remove the userstore domain from username /*if (username.contains("/")) { username = username.substring(username.indexOf('/') + 1); }*/ authenticationInfo.setUsername(username); - authenticationInfo.setTenantDomain(oAuthValidationResponse.getTenantDomain()); - authenticationInfo.setTenantId(Utils.getTenantIdOFUser(username)); + authenticationInfo.setTenantDomain(tenantDomain); + authenticationInfo.setTenantId(Utils.getTenantIdOFUser(username + "@" + tenantDomain)); if (oAuthValidationResponse.isValid()) { authenticationInfo.setStatus(Status.CONTINUE); }