diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.mobile.impl/pom.xml b/components/device-mgt/org.wso2.carbon.device.mgt.mobile.impl/pom.xml index 20dcd918572..807464e4934 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.mobile.impl/pom.xml +++ b/components/device-mgt/org.wso2.carbon.device.mgt.mobile.impl/pom.xml @@ -61,7 +61,7 @@ !org.wso2.carbon.device.mgt.mobile.internal, - org.wso2.carbon.device.mgt.mobile.impl.* + org.wso2.carbon.device.mgt.mobile.* * @@ -103,6 +103,16 @@ org.wso2.carbon org.wso2.carbon.apimgt.core + + org.testng + testng + + + commons-dbcp + commons-dbcp + 1.2.2 + test + \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.mobile.impl/pom1.xml~ b/components/device-mgt/org.wso2.carbon.device.mgt.mobile.impl/pom1.xml~ new file mode 100644 index 00000000000..e69de29bb2d diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.mobile.impl/src/main/java/org/wso2/carbon/device/mgt/mobile/config/APIPublisherConfig.java b/components/device-mgt/org.wso2.carbon.device.mgt.mobile.impl/src/main/java/org/wso2/carbon/device/mgt/mobile/config/APIPublisherConfig.java index 27454d10c90..faeaa2474b6 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.mobile.impl/src/main/java/org/wso2/carbon/device/mgt/mobile/config/APIPublisherConfig.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.mobile.impl/src/main/java/org/wso2/carbon/device/mgt/mobile/config/APIPublisherConfig.java @@ -16,6 +16,7 @@ package org.wso2.carbon.device.mgt.mobile.config; import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlElementWrapper; import javax.xml.bind.annotation.XmlRootElement; import java.util.List; @@ -24,12 +25,13 @@ public class APIPublisherConfig { private List apis; - @XmlElement(name = "APIs") - public List getApis() { + @XmlElementWrapper(name = "APIs", nillable = false, required = true) + @XmlElement(name = "API", nillable = false) + public List getAPIs() { return apis; } - public void setApis(List apis) { + public void setAPIs(List apis) { this.apis = apis; } diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.mobile.impl/src/main/java/org/wso2/carbon/device/mgt/mobile/config/MobileDeviceConfigurationManager.java b/components/device-mgt/org.wso2.carbon.device.mgt.mobile.impl/src/main/java/org/wso2/carbon/device/mgt/mobile/config/MobileDeviceConfigurationManager.java index 551aa1ddad7..f5e074ec598 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.mobile.impl/src/main/java/org/wso2/carbon/device/mgt/mobile/config/MobileDeviceConfigurationManager.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.mobile.impl/src/main/java/org/wso2/carbon/device/mgt/mobile/config/MobileDeviceConfigurationManager.java @@ -32,12 +32,13 @@ import java.io.File; public class MobileDeviceConfigurationManager { private static final String MOBILE_DEVICE_CONFIG_XML_NAME = "mobile-config.xml"; + private static final String MOBILE_DEVICE_PLUGIN_DIRECTORY = "mobile"; private MobileDeviceManagementConfig currentMobileDeviceConfig; private static MobileDeviceConfigurationManager mobileDeviceConfigManager; private final String mobileDeviceMgtConfigXMLPath = - CarbonUtils.getCarbonConfigDirPath() + File.separator + - MOBILE_DEVICE_CONFIG_XML_NAME; + CarbonUtils.getEtcCarbonConfigDirPath() + File.separator + "device-mgt-plugin-configs" + File.separator + + MOBILE_DEVICE_PLUGIN_DIRECTORY + File.separator + MOBILE_DEVICE_CONFIG_XML_NAME; public static MobileDeviceConfigurationManager getInstance() { if (mobileDeviceConfigManager == null) { diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.mobile.impl/src/main/java/org/wso2/carbon/device/mgt/mobile/dao/DeviceOperationDAO.java b/components/device-mgt/org.wso2.carbon.device.mgt.mobile.impl/src/main/java/org/wso2/carbon/device/mgt/mobile/dao/DeviceOperationDAO.java new file mode 100644 index 00000000000..4273e13b5ac --- /dev/null +++ b/components/device-mgt/org.wso2.carbon.device.mgt.mobile.impl/src/main/java/org/wso2/carbon/device/mgt/mobile/dao/DeviceOperationDAO.java @@ -0,0 +1,63 @@ +package org.wso2.carbon.device.mgt.mobile.dao; + +import org.wso2.carbon.device.mgt.mobile.dto.DeviceOperation; + +import java.util.List; + +/** + * This class represents the mapping between device and operations. + */ +public interface DeviceOperationDAO { + /** + * Add a new mapping to plugin device_operation table. + * + * @param deviceOperation DeviceOperation object that holds data related to the DeviceOperation + * to be inserted. + * @return The status of the operation. If the insert was successful or not. + * @throws MobileDeviceManagementDAOException + */ + boolean addDeviceOperation(DeviceOperation deviceOperation) + throws MobileDeviceManagementDAOException; + + /** + * Update a feature in the feature table. + * + * @param deviceOperation DeviceOperation object that holds data has to be updated. + * @return The status of the operation. If the update was successful or not. + * @throws MobileDeviceManagementDAOException + */ + boolean updateDeviceOperation(DeviceOperation deviceOperation) + throws MobileDeviceManagementDAOException; + + /** + * Delete a given device operation from device operation table. + * + * @param deviceId Device id of the mapping to be deleted. + * @param operationId Operation id of the mapping to be deleted. + * @return The status of the operation. If the deletion was successful or not. + * @throws MobileDeviceManagementDAOException + */ + boolean deleteDeviceOperation(String deviceId, int operationId) + throws MobileDeviceManagementDAOException; + + /** + * Retrieve a given device operation from plugin database. + * + * @param deviceId Device id of the mapping to be retrieved. + * @param operationId Operation id of the mapping to be retrieved. + * @return DeviceOperation object that holds data of the device operation mapping represented by + * deviceId and operationId. + * @throws MobileDeviceManagementDAOException + */ + DeviceOperation getDeviceOperation(String deviceId, int operationId) + throws MobileDeviceManagementDAOException; + + /** + * Retrieve all the device operation mapping from plugin database. + * + * @return Device operation mapping object list. + * @throws MobileDeviceManagementDAOException + */ + List getAllDeviceOperationOfDevice(String deviceId) + throws MobileDeviceManagementDAOException; +} diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.mobile.impl/src/main/java/org/wso2/carbon/device/mgt/mobile/dao/FeatureDAO.java b/components/device-mgt/org.wso2.carbon.device.mgt.mobile.impl/src/main/java/org/wso2/carbon/device/mgt/mobile/dao/FeatureDAO.java new file mode 100644 index 00000000000..37ac430c83d --- /dev/null +++ b/components/device-mgt/org.wso2.carbon.device.mgt.mobile.impl/src/main/java/org/wso2/carbon/device/mgt/mobile/dao/FeatureDAO.java @@ -0,0 +1,74 @@ +package org.wso2.carbon.device.mgt.mobile.dao; + +import org.wso2.carbon.device.mgt.mobile.dto.Feature; + +import java.util.List; + +/** + * This class represents the key operations associated with persisting feature related + * information. + */ +public interface FeatureDAO { + + /** + * Add a new feature to feature table. + * + * @param feature Feature object that holds data related to the feature to be inserted. + * @return The status of the operation. If the insert was successful or not. + * @throws MobileDeviceManagementDAOException + */ + boolean addFeature(Feature feature) throws MobileDeviceManagementDAOException; + + /** + * Update a feature in the feature table. + * + * @param feature Feature object that holds data has to be updated. + * @return The status of the operation. If the update was successful or not. + * @throws MobileDeviceManagementDAOException + */ + boolean updateFeature(Feature feature) throws MobileDeviceManagementDAOException; + + /** + * Delete a feature from feature table when the feature id is given. + * + * @param featureId Feature id of the feature to be deleted. + * @return The status of the operation. If the operationId was successful or not. + * @throws MobileDeviceManagementDAOException + */ + boolean deleteFeatureById(String featureId) throws MobileDeviceManagementDAOException; + + /** + * Delete a feature from feature table when the feature code is given. + * + * @param featureCode Feature code of the feature to be deleted. + * @return The status of the operation. If the operationId was successful or not. + * @throws MobileDeviceManagementDAOException + */ + boolean deleteFeatureByCode(String featureCode) throws MobileDeviceManagementDAOException; + + /** + * Retrieve a given feature from feature table when the feature id is given. + * + * @param featureId Feature id of the feature to be retrieved. + * @return Feature object that holds data of the feature represented by featureId. + * @throws MobileDeviceManagementDAOException + */ + Feature getFeatureById(String featureId) throws MobileDeviceManagementDAOException; + + /** + * Retrieve a given feature from feature table when the feature code is given. + * + * @param featureCode Feature code of the feature to be retrieved. + * @return Feature object that holds data of the feature represented by featureCode. + * @throws MobileDeviceManagementDAOException + */ + Feature getFeatureByCode(String featureCode) throws MobileDeviceManagementDAOException; + + /** + * Retrieve all the features from plugin specific database. + * + * @return Feature object list. + * @throws MobileDeviceManagementDAOException + */ + List getAllFeatures() throws MobileDeviceManagementDAOException; +} diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.mobile.impl/src/main/java/org/wso2/carbon/device/mgt/mobile/dao/FeaturePropertyDAO.java b/components/device-mgt/org.wso2.carbon.device.mgt.mobile.impl/src/main/java/org/wso2/carbon/device/mgt/mobile/dao/FeaturePropertyDAO.java new file mode 100644 index 00000000000..e0d60ddc167 --- /dev/null +++ b/components/device-mgt/org.wso2.carbon.device.mgt.mobile.impl/src/main/java/org/wso2/carbon/device/mgt/mobile/dao/FeaturePropertyDAO.java @@ -0,0 +1,60 @@ +package org.wso2.carbon.device.mgt.mobile.dao; + +import org.wso2.carbon.device.mgt.mobile.dto.FeatureProperty; + +import java.util.List; + +/** + * This class represents the key operations associated with persisting feature property related + * information. + */ +public interface FeaturePropertyDAO { + /** + * Add a new feature property to feature property table. + * + * @param featureProperty Feature property object that holds data related to the feature property to be inserted. + * @return The status of the operation. If the insert was successful or not. + * @throws MobileDeviceManagementDAOException + */ + boolean addFeatureProperty(FeatureProperty featureProperty) + throws MobileDeviceManagementDAOException; + + /** + * Update a feature property in the feature property table. + * + * @param featureProperty Feature property object that holds data has to be updated. + * @return The status of the operation. If the update was successful or not. + * @throws MobileDeviceManagementDAOException + */ + boolean updateFeatureProperty(FeatureProperty featureProperty) + throws MobileDeviceManagementDAOException; + + /** + * Delete a given feature property from feature property table. + * + * @param propertyId Id of the feature property to be deleted. + * @return The status of the operation. If the operationId was successful or not. + * @throws MobileDeviceManagementDAOException + */ + boolean deleteFeatureProperty(int propertyId) throws MobileDeviceManagementDAOException; + + /** + * Retrieve a given feature property from feature property table. + * + * @param propertyId Id of the feature property to be retrieved. + * @return Feature property object that holds data of the feature property represented by propertyId. + * @throws MobileDeviceManagementDAOException + */ + FeatureProperty getFeatureProperty(int propertyId) throws MobileDeviceManagementDAOException; + + /** + * Retrieve a list of feature property corresponds to a feature id . + * + * @param featureId feature id of the feature property to be retrieved. + * @return Feature property object that holds data of the feature property represented by propertyId. + * @throws MobileDeviceManagementDAOException + */ + List getFeaturePropertyOfFeature(String featureId) + throws MobileDeviceManagementDAOException; + +} diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.mobile.impl/src/main/java/org/wso2/carbon/device/mgt/mobile/dao/MobileDeviceDAO.java b/components/device-mgt/org.wso2.carbon.device.mgt.mobile.impl/src/main/java/org/wso2/carbon/device/mgt/mobile/dao/MobileDeviceDAO.java index ecb72d88d5d..c1eb2c33390 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.mobile.impl/src/main/java/org/wso2/carbon/device/mgt/mobile/dao/MobileDeviceDAO.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.mobile.impl/src/main/java/org/wso2/carbon/device/mgt/mobile/dao/MobileDeviceDAO.java @@ -17,6 +17,7 @@ package org.wso2.carbon.device.mgt.mobile.dao; import org.wso2.carbon.device.mgt.mobile.dto.MobileDevice; +import java.util.List; /** * This class represents the key operations associated with persisting mobile-device related @@ -32,4 +33,6 @@ public interface MobileDeviceDAO { boolean deleteDevice(String deviceId) throws MobileDeviceManagementDAOException; + List getAllDevices() throws MobileDeviceManagementDAOException; + } diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.mobile.impl/src/main/java/org/wso2/carbon/device/mgt/mobile/dao/OperationDAO.java b/components/device-mgt/org.wso2.carbon.device.mgt.mobile.impl/src/main/java/org/wso2/carbon/device/mgt/mobile/dao/OperationDAO.java new file mode 100644 index 00000000000..8fba815ace8 --- /dev/null +++ b/components/device-mgt/org.wso2.carbon.device.mgt.mobile.impl/src/main/java/org/wso2/carbon/device/mgt/mobile/dao/OperationDAO.java @@ -0,0 +1,45 @@ +package org.wso2.carbon.device.mgt.mobile.dao; + +import org.wso2.carbon.device.mgt.mobile.dto.Operation; + +import java.util.List; + +/** + * This class represents the key operations associated with persisting operation related + * information. + */ +public interface OperationDAO { + + /** + * Add a new operation to plugin operation table. + * @param operation Operation object that holds data related to the operation to be inserted. + * @return The status of the operation. If the insert was successful or not. + * @throws MobileDeviceManagementDAOException + */ + boolean addOperation(Operation operation) throws MobileDeviceManagementDAOException; + + /** + * Update a operation in the operation table. + * @param operation Operation object that holds data has to be updated. + * @return The status of the operation. If the update was successful or not. + * @throws MobileDeviceManagementDAOException + */ + boolean updateOperation(Operation operation) throws MobileDeviceManagementDAOException; + + /** + * Delete a given operation from plugin database. + * @param operationId Operation code of the operation to be deleted. + * @return The status of the operation. If the operationId was successful or not. + * @throws MobileDeviceManagementDAOException + */ + boolean deleteOperation(int operationId) throws MobileDeviceManagementDAOException; + + /** + * Retrieve a given operation from plugin database. + * @param operationId Operation id of the operation to be retrieved. + * @return Operation object that holds data of the feature represented by operationId. + * @throws MobileDeviceManagementDAOException + */ + Operation getOperation(int operationId) throws MobileDeviceManagementDAOException; + +} diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.mobile.impl/src/main/java/org/wso2/carbon/device/mgt/mobile/dao/OperationPropertyDAO.java b/components/device-mgt/org.wso2.carbon.device.mgt.mobile.impl/src/main/java/org/wso2/carbon/device/mgt/mobile/dao/OperationPropertyDAO.java new file mode 100644 index 00000000000..de012babb8f --- /dev/null +++ b/components/device-mgt/org.wso2.carbon.device.mgt.mobile.impl/src/main/java/org/wso2/carbon/device/mgt/mobile/dao/OperationPropertyDAO.java @@ -0,0 +1,61 @@ +package org.wso2.carbon.device.mgt.mobile.dao; + +import org.wso2.carbon.device.mgt.mobile.dto.OperationProperty; + +import java.util.List; + +/** + * This class represents the key operations associated with persisting operation property related + * information. + */ +public interface OperationPropertyDAO { + /** + * Add a new mapping to plugin operation property table. + * + * @param operationProperty OperationProperty object that holds data related to the operation property to be inserted. + * @return The status of the operation. If the insert was successful or not. + * @throws MobileDeviceManagementDAOException + */ + boolean addOperationProperty(OperationProperty operationProperty) + throws MobileDeviceManagementDAOException; + + /** + * Update a feature in the feature table. + * + * @param operationProperty DeviceOperation object that holds data has to be updated. + * @return The status of the operation. If the update was successful or not. + * @throws MobileDeviceManagementDAOException + */ + boolean updateOperationProperty(OperationProperty operationProperty) + throws MobileDeviceManagementDAOException; + + /** + * Delete a given device operation from plugin database. + * + * @param operationPropertyId Device id of the mapping to be deleted. + * @return The status of the operation. If the deletion was successful or not. + * @throws MobileDeviceManagementDAOException + */ + boolean deleteOperationProperty(int operationPropertyId) + throws MobileDeviceManagementDAOException; + + /** + * Retrieve a given device operation from plugin database. + * + * @param deviceId Device id of the mapping to be retrieved. + * @param operationId Operation id of the mapping to be retrieved. + * @return DeviceOperation object that holds data of the device operation mapping represented by deviceId and operationId. + * @throws MobileDeviceManagementDAOException + */ + OperationProperty getOperationProperty(String deviceId, int operationId) + throws MobileDeviceManagementDAOException; + + /** + * Retrieve all the device operation mapping from plugin database. + * + * @return Device operation mapping object list. + * @throws MobileDeviceManagementDAOException + */ + List getAllDeviceOperationOfDevice(String deviceId) + throws MobileDeviceManagementDAOException; +} diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.mobile.impl/src/main/java/org/wso2/carbon/device/mgt/mobile/dao/impl/DeviceOperationDAOImpl.java b/components/device-mgt/org.wso2.carbon.device.mgt.mobile.impl/src/main/java/org/wso2/carbon/device/mgt/mobile/dao/impl/DeviceOperationDAOImpl.java new file mode 100644 index 00000000000..26c5884d995 --- /dev/null +++ b/components/device-mgt/org.wso2.carbon.device.mgt.mobile.impl/src/main/java/org/wso2/carbon/device/mgt/mobile/dao/impl/DeviceOperationDAOImpl.java @@ -0,0 +1,196 @@ +package org.wso2.carbon.device.mgt.mobile.dao.impl; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.wso2.carbon.device.mgt.mobile.dao.DeviceOperationDAO; +import org.wso2.carbon.device.mgt.mobile.dao.MobileDeviceManagementDAOException; +import org.wso2.carbon.device.mgt.mobile.dao.util.MobileDeviceManagementDAOUtil; +import org.wso2.carbon.device.mgt.mobile.dto.DeviceOperation; + +import javax.sql.DataSource; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; + +/** + * Implementation of DeviceOperationDAO + */ +public class DeviceOperationDAOImpl implements DeviceOperationDAO { + + private DataSource dataSource; + private static final Log log = LogFactory.getLog(DeviceOperationDAOImpl.class); + + public DeviceOperationDAOImpl(DataSource dataSource) { + this.dataSource = dataSource; + } + + @Override + public boolean addDeviceOperation(DeviceOperation deviceOperation) + throws MobileDeviceManagementDAOException { + boolean status = false; + Connection conn = null; + PreparedStatement stmt = null; + try { + conn = this.getConnection(); + String createDBQuery = + "INSERT INTO MBL_DEVICE_OPERATION(DEVICE_ID, OPERATION_ID, SENT_DATE, RECEIVED_DATE) VALUES (?, ?, ?, ?)"; + + stmt = conn.prepareStatement(createDBQuery); + stmt.setString(1, deviceOperation.getDeviceId()); + stmt.setInt(2, deviceOperation.getOperationId()); + stmt.setInt(3, deviceOperation.getSentDate()); + stmt.setInt(4, deviceOperation.getReceivedDate()); + int rows = stmt.executeUpdate(); + if (rows > 0) { + status = true; + } + } catch (SQLException e) { + String msg = "Error occurred while adding device id - '" + + deviceOperation.getDeviceId() + " and operation id - " + deviceOperation.getOperationId() + "of mapping table MBL_DEVICE_OPERATION";; + log.error(msg, e); + throw new MobileDeviceManagementDAOException(msg, e); + } finally { + MobileDeviceManagementDAOUtil.cleanupResources(conn, stmt, null); + } + return status; + } + + @Override + public boolean updateDeviceOperation(DeviceOperation deviceOperation) + throws MobileDeviceManagementDAOException { + boolean status = false; + Connection conn = null; + PreparedStatement stmt = null; + try { + conn = this.getConnection(); + String updateDBQuery = + "UPDATE MBL_DEVICE_OPERATION SET SENT_DATE = ?, RECEIVED_DATE = ? WHERE DEVICE_ID = ? and OPERATION_ID=?"; + stmt = conn.prepareStatement(updateDBQuery); + stmt.setInt(1, deviceOperation.getSentDate()); + stmt.setInt(2, deviceOperation.getReceivedDate()); + stmt.setString(3, deviceOperation.getDeviceId()); + stmt.setInt(4, deviceOperation.getOperationId()); + int rows = stmt.executeUpdate(); + if (rows > 0) { + status = true; + } + } catch (SQLException e) { + String msg = "Error occurred while updating device id - '" + + deviceOperation.getDeviceId() + " and operation id - " + deviceOperation.getOperationId() + "of mapping table MBL_DEVICE_OPERATION"; + log.error(msg, e); + throw new MobileDeviceManagementDAOException(msg, e); + } finally { + MobileDeviceManagementDAOUtil.cleanupResources(conn, stmt, null); + } + return status; + } + + @Override + public boolean deleteDeviceOperation(String deviceId, int operationId) + throws MobileDeviceManagementDAOException { + boolean status = false; + Connection conn = null; + PreparedStatement stmt = null; + try { + conn = this.getConnection(); + String deleteDBQuery = + "DELETE FROM MBL_DEVICE_OPERATION WHERE DEVICE_ID = ? and OPERATION_ID=?"; + stmt = conn.prepareStatement(deleteDBQuery); + stmt.setString(1, deviceId); + stmt.setInt(2, operationId); + int rows = stmt.executeUpdate(); + if(rows>0){ + status = true; + } + } catch (SQLException e) { + String msg = "Error occurred while deleting mapping table MBL_DEVICE_OPERATION with device id - '" + + deviceId + " and operation id - " + operationId; + log.error(msg, e); + throw new MobileDeviceManagementDAOException(msg, e); + } finally { + MobileDeviceManagementDAOUtil.cleanupResources(conn, stmt, null); + } + return status; + } + + @Override + public DeviceOperation getDeviceOperation(String deviceId, int operationId) + throws MobileDeviceManagementDAOException { + Connection conn = null; + PreparedStatement stmt = null; + DeviceOperation deviceOperation = null; + try { + conn = this.getConnection(); + String selectDBQuery = + "SELECT DEVICE_ID, OPERATION_ID, SENT_DATE, RECEIVED_DATE FROM MBL_DEVICE_OPERATION WHERE DEVICE_ID = ? and OPERATION_ID=?"; + stmt = conn.prepareStatement(selectDBQuery); + stmt.setString(1, deviceId); + stmt.setInt(2, operationId); + ResultSet resultSet = stmt.executeQuery(); + while (resultSet.next()) { + deviceOperation = new DeviceOperation(); + deviceOperation.setDeviceId(resultSet.getString(1)); + deviceOperation.setOperationId(resultSet.getInt(2)); + deviceOperation.setSentDate(resultSet.getInt(3)); + deviceOperation.setReceivedDate(resultSet.getInt(4)); + break; + } + } catch (SQLException e) { + String msg = "Error occurred while fetching mapping table MBL_DEVICE_OPERATION entry with device id - '" + + deviceId + " and operation id - " + operationId; + log.error(msg, e); + throw new MobileDeviceManagementDAOException(msg, e); + } finally { + MobileDeviceManagementDAOUtil.cleanupResources(conn, stmt, null); + } + return deviceOperation; + } + + @Override + public List getAllDeviceOperationOfDevice(String deviceId) + throws MobileDeviceManagementDAOException { + Connection conn = null; + PreparedStatement stmt = null; + DeviceOperation deviceOperation = null; + List deviceOperations=new ArrayList(); + try { + conn = this.getConnection(); + String selectDBQuery = + "SELECT DEVICE_ID, OPERATION_ID, SENT_DATE, RECEIVED_DATE FROM MBL_DEVICE_OPERATION WHERE DEVICE_ID = ?"; + stmt = conn.prepareStatement(selectDBQuery); + stmt.setString(1, deviceId); + ResultSet resultSet = stmt.executeQuery(); + while (resultSet.next()) { + deviceOperation = new DeviceOperation(); + deviceOperation.setDeviceId(resultSet.getString(1)); + deviceOperation.setOperationId(resultSet.getInt(2)); + deviceOperation.setSentDate(resultSet.getInt(3)); + deviceOperation.setReceivedDate(resultSet.getInt(4)); + deviceOperations.add(deviceOperation); + break; + } + } catch (SQLException e) { + String msg = "Error occurred while fetching mapping table MBL_DEVICE_OPERATION entry with device id - '" + + deviceId; + log.error(msg, e); + throw new MobileDeviceManagementDAOException(msg, e); + } finally { + MobileDeviceManagementDAOUtil.cleanupResources(conn, stmt, null); + } + return deviceOperations; + } + + private Connection getConnection() throws MobileDeviceManagementDAOException { + try { + return dataSource.getConnection(); + } catch (SQLException e) { + String msg = "Error occurred while obtaining a connection from the mobile device " + + "management metadata repository datasource."; + log.error(msg, e); + throw new MobileDeviceManagementDAOException(msg, e); + } + } +} diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.mobile.impl/src/main/java/org/wso2/carbon/device/mgt/mobile/dao/impl/FeatureDAOImpl.java b/components/device-mgt/org.wso2.carbon.device.mgt.mobile.impl/src/main/java/org/wso2/carbon/device/mgt/mobile/dao/impl/FeatureDAOImpl.java new file mode 100644 index 00000000000..ba82b9d5b6f --- /dev/null +++ b/components/device-mgt/org.wso2.carbon.device.mgt.mobile.impl/src/main/java/org/wso2/carbon/device/mgt/mobile/dao/impl/FeatureDAOImpl.java @@ -0,0 +1,245 @@ +package org.wso2.carbon.device.mgt.mobile.dao.impl; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.wso2.carbon.device.mgt.mobile.dao.FeatureDAO; +import org.wso2.carbon.device.mgt.mobile.dao.MobileDeviceManagementDAOException; +import org.wso2.carbon.device.mgt.mobile.dao.util.MobileDeviceManagementDAOUtil; +import org.wso2.carbon.device.mgt.mobile.dto.Feature; + +import javax.sql.DataSource; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; + +/** + * Implementation of FeatureDAO + */ +public class FeatureDAOImpl implements FeatureDAO { + + private DataSource dataSource; + private static final Log log = LogFactory.getLog(FeatureDAOImpl.class); + + public FeatureDAOImpl(DataSource dataSource) { + this.dataSource = dataSource; + } + + @Override + public boolean addFeature(Feature feature) throws MobileDeviceManagementDAOException { + boolean status = false; + Connection conn = null; + PreparedStatement stmt = null; + try { + conn = this.getConnection(); + String createDBQuery = + "INSERT INTO MBL_FEATURE(CODE, NAME, DESCRIPTION) VALUES (?, ?, ?)"; + + stmt = conn.prepareStatement(createDBQuery); + stmt.setString(1, feature.getCode()); + stmt.setString(2, feature.getName()); + stmt.setString(3, feature.getDescription()); + int rows = stmt.executeUpdate(); + if (rows > 0) { + status = true; + } + } catch (SQLException e) { + String msg = "Error occurred while adding feature code - '" + + feature.getCode() + "' to feature table"; + log.error(msg, e); + throw new MobileDeviceManagementDAOException(msg, e); + } finally { + MobileDeviceManagementDAOUtil.cleanupResources(conn, stmt, null); + } + return status; + } + + @Override + public boolean updateFeature(Feature feature) + throws MobileDeviceManagementDAOException { + boolean status = false; + Connection conn = null; + PreparedStatement stmt = null; + try { + conn = this.getConnection(); + String updateDBQuery = + "UPDATE MBL_FEATURE SET CODE = ?, NAME = ?, DESCRIPTION = ? WHERE FEATURE_ID = ?"; + stmt = conn.prepareStatement(updateDBQuery); + stmt.setString(1, feature.getCode()); + stmt.setString(2, feature.getName()); + stmt.setString(3, feature.getDescription()); + stmt.setInt(4, feature.getId()); + int rows = stmt.executeUpdate(); + if (rows > 0) { + status = true; + } + } catch (SQLException e) { + String msg = "Error occurred while updating the feature with feature code - '" + + feature.getId() + "'"; + log.error(msg, e); + throw new MobileDeviceManagementDAOException(msg, e); + } finally { + MobileDeviceManagementDAOUtil.cleanupResources(conn, stmt, null); + } + return status; + } + + @Override + public boolean deleteFeatureByCode(String featureCode) + throws MobileDeviceManagementDAOException { + boolean status = false; + Connection conn = null; + PreparedStatement stmt = null; + try { + conn = this.getConnection(); + String deleteDBQuery = + "DELETE FROM MBL_FEATURE WHERE CODE = ?"; + stmt = conn.prepareStatement(deleteDBQuery); + stmt.setString(1, featureCode); + int rows = stmt.executeUpdate(); + if (rows > 0) { + status = true; + } + } catch (SQLException e) { + String msg = "Error occurred while deleting feature with code - " + featureCode; + log.error(msg, e); + throw new MobileDeviceManagementDAOException(msg, e); + } finally { + MobileDeviceManagementDAOUtil.cleanupResources(conn, stmt, null); + } + return status; + } + + @Override + public boolean deleteFeatureById(String featureId) + throws MobileDeviceManagementDAOException { + boolean status = false; + Connection conn = null; + PreparedStatement stmt = null; + try { + conn = this.getConnection(); + String deleteDBQuery = + "DELETE FROM MBL_FEATURE WHERE FEATURE_ID = ?"; + stmt = conn.prepareStatement(deleteDBQuery); + stmt.setString(1, featureId); + int rows = stmt.executeUpdate(); + if (rows > 0) { + status = true; + } + } catch (SQLException e) { + String msg = "Error occurred while deleting feature with id - " + featureId; + log.error(msg, e); + throw new MobileDeviceManagementDAOException(msg, e); + } finally { + MobileDeviceManagementDAOUtil.cleanupResources(conn, stmt, null); + } + return status; + } + + @Override + public Feature getFeatureByCode(String featureCode) + throws MobileDeviceManagementDAOException { + Connection conn = null; + PreparedStatement stmt = null; + Feature feature = null; + try { + conn = this.getConnection(); + String selectDBQuery = + "SELECT FEATURE_ID, CODE, NAME, DESCRIPTION FROM MBL_FEATURE WHERE CODE = ?"; + stmt = conn.prepareStatement(selectDBQuery); + stmt.setString(1, featureCode); + ResultSet resultSet = stmt.executeQuery(); + while (resultSet.next()) { + feature = new Feature(); + feature.setId(resultSet.getInt(1)); + feature.setCode(resultSet.getString(2)); + feature.setName(resultSet.getString(3)); + feature.setDescription(resultSet.getString(4)); + break; + } + } catch (SQLException e) { + String msg = "Error occurred while fetching feature code - '" + + featureCode + "'"; + log.error(msg, e); + throw new MobileDeviceManagementDAOException(msg, e); + } finally { + MobileDeviceManagementDAOUtil.cleanupResources(conn, stmt, null); + } + return feature; + } + + @Override + public Feature getFeatureById(String featureID) + throws MobileDeviceManagementDAOException { + Connection conn = null; + PreparedStatement stmt = null; + Feature feature = null; + try { + conn = this.getConnection(); + String selectDBQuery = + "SELECT FEATURE_ID, CODE, NAME, DESCRIPTION FROM MBL_FEATURE WHERE FEATURE_ID = ?"; + stmt = conn.prepareStatement(selectDBQuery); + stmt.setString(1, featureID); + ResultSet resultSet = stmt.executeQuery(); + while (resultSet.next()) { + feature = new Feature(); + feature.setId(resultSet.getInt(1)); + feature.setCode(resultSet.getString(2)); + feature.setName(resultSet.getString(3)); + feature.setDescription(resultSet.getString(4)); + break; + } + } catch (SQLException e) { + String msg = "Error occurred while fetching feature id - '" + + featureID + "'"; + log.error(msg, e); + throw new MobileDeviceManagementDAOException(msg, e); + } finally { + MobileDeviceManagementDAOUtil.cleanupResources(conn, stmt, null); + } + return feature; + } + + @Override + public List getAllFeatures() throws MobileDeviceManagementDAOException { + Connection conn = null; + PreparedStatement stmt = null; + Feature feature; + List features = new ArrayList(); + try { + conn = this.getConnection(); + String selectDBQuery = + "SELECT FEATURE_ID, CODE, NAME, DESCRIPTION FROM MBL_FEATURE"; + stmt = conn.prepareStatement(selectDBQuery); + ResultSet resultSet = stmt.executeQuery(); + while (resultSet.next()) { + feature = new Feature(); + feature.setId(resultSet.getInt(1)); + feature.setCode(resultSet.getString(2)); + feature.setName(resultSet.getString(3)); + feature.setDescription(resultSet.getString(4)); + features.add(feature); + } + return features; + } catch (SQLException e) { + String msg = "Error occurred while fetching all features.'"; + log.error(msg, e); + throw new MobileDeviceManagementDAOException(msg, e); + } finally { + MobileDeviceManagementDAOUtil.cleanupResources(conn, stmt, null); + } + } + + private Connection getConnection() throws MobileDeviceManagementDAOException { + try { + return dataSource.getConnection(); + } catch (SQLException e) { + String msg = "Error occurred while obtaining a connection from the mobile specific " + + "datasource."; + log.error(msg, e); + throw new MobileDeviceManagementDAOException(msg, e); + } + } +} diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.mobile.impl/src/main/java/org/wso2/carbon/device/mgt/mobile/dao/impl/FeaturePropertyDAOImpl.java b/components/device-mgt/org.wso2.carbon.device.mgt.mobile.impl/src/main/java/org/wso2/carbon/device/mgt/mobile/dao/impl/FeaturePropertyDAOImpl.java new file mode 100644 index 00000000000..64473f0bff7 --- /dev/null +++ b/components/device-mgt/org.wso2.carbon.device.mgt.mobile.impl/src/main/java/org/wso2/carbon/device/mgt/mobile/dao/impl/FeaturePropertyDAOImpl.java @@ -0,0 +1,186 @@ +package org.wso2.carbon.device.mgt.mobile.dao.impl; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.wso2.carbon.device.mgt.mobile.dao.FeaturePropertyDAO; +import org.wso2.carbon.device.mgt.mobile.dao.MobileDeviceManagementDAOException; +import org.wso2.carbon.device.mgt.mobile.dao.util.MobileDeviceManagementDAOUtil; +import org.wso2.carbon.device.mgt.mobile.dto.FeatureProperty; + +import javax.sql.DataSource; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; + +/** + * Implementation of FeaturePropertyDAO + */ +public class FeaturePropertyDAOImpl implements FeaturePropertyDAO { + + private DataSource dataSource; + private static final Log log = LogFactory.getLog(FeaturePropertyDAOImpl.class); + + public FeaturePropertyDAOImpl(DataSource dataSource) { + this.dataSource = dataSource; + } + + @Override + public boolean addFeatureProperty(FeatureProperty featureProperty) + throws MobileDeviceManagementDAOException { + boolean status = false; + Connection conn = null; + PreparedStatement stmt = null; + try { + conn = this.getConnection(); + String createDBQuery = + "INSERT INTO MBL_FEATURE_PROPERTY(PROPERTY, FEATURE_ID) VALUES (?, ?)"; + + stmt = conn.prepareStatement(createDBQuery); + stmt.setString(1, featureProperty.getProperty()); + stmt.setString(2, featureProperty.getFeatureID()); + int rows = stmt.executeUpdate(); + if (rows > 0) { + status = true; + } + } catch (SQLException e) { + String msg = "Error occurred while adding property id - '" + + featureProperty.getFeatureID() + "'"; + log.error(msg, e); + throw new MobileDeviceManagementDAOException(msg, e); + } finally { + MobileDeviceManagementDAOUtil.cleanupResources(conn, stmt, null); + } + return status; + } + + @Override + public boolean updateFeatureProperty(FeatureProperty featureProperty) + throws MobileDeviceManagementDAOException { + boolean status = false; + Connection conn = null; + PreparedStatement stmt = null; + try { + conn = this.getConnection(); + String updateDBQuery = + "UPDATE MBL_FEATURE_PROPERTY SET PROPERTY = ?, FEATURE_ID = ? WHERE PROPERTY_ID = ?"; + stmt = conn.prepareStatement(updateDBQuery); + stmt.setString(1, featureProperty.getProperty()); + stmt.setString(2, featureProperty.getFeatureID()); + stmt.setInt(3, featureProperty.getPropertyId()); + int rows = stmt.executeUpdate(); + if (rows > 0) { + status = true; + } + } catch (SQLException e) { + String msg = "Error occurred while updating the feature property with property id - '" + + featureProperty.getPropertyId() + "'"; + log.error(msg, e); + throw new MobileDeviceManagementDAOException(msg, e); + } finally { + MobileDeviceManagementDAOUtil.cleanupResources(conn, stmt, null); + } + return status; + } + + @Override + public boolean deleteFeatureProperty(int propertyId) + throws MobileDeviceManagementDAOException { + boolean status = false; + Connection conn = null; + PreparedStatement stmt = null; + try { + conn = this.getConnection(); + String deleteDBQuery = + "DELETE FROM MBL_FEATURE_PROPERTY WHERE PROPERTY_ID = ?"; + stmt = conn.prepareStatement(deleteDBQuery); + stmt.setInt(1, propertyId); + int rows = stmt.executeUpdate(); + if (rows > 0) { + status = true; + } + } catch (SQLException e) { + String msg = "Error occurred while deleting feature property with property Id - " + + propertyId; + log.error(msg, e); + throw new MobileDeviceManagementDAOException(msg, e); + } finally { + MobileDeviceManagementDAOUtil.cleanupResources(conn, stmt, null); + } + return status; + } + + @Override + public FeatureProperty getFeatureProperty(int propertyId) + throws MobileDeviceManagementDAOException { + Connection conn = null; + PreparedStatement stmt = null; + FeatureProperty featureProperty = null; + try { + conn = this.getConnection(); + String selectDBQuery = + "SELECT PROPERTY, FEATURE_ID FROM MBL_FEATURE_PROPERTY WHERE PROPERTY_ID = ?"; + stmt = conn.prepareStatement(selectDBQuery); + stmt.setInt(1, propertyId); + ResultSet resultSet = stmt.executeQuery(); + while (resultSet.next()) { + featureProperty = new FeatureProperty(); + featureProperty.setProperty(resultSet.getString(1)); + featureProperty.setFeatureID(resultSet.getString(2)); + break; + } + } catch (SQLException e) { + String msg = "Error occurred while fetching property Id - '" + + propertyId + "'"; + log.error(msg, e); + throw new MobileDeviceManagementDAOException(msg, e); + } finally { + MobileDeviceManagementDAOUtil.cleanupResources(conn, stmt, null); + } + return featureProperty; + } + + @Override + public List getFeaturePropertyOfFeature(String featureId) + throws MobileDeviceManagementDAOException { + Connection conn = null; + PreparedStatement stmt = null; + FeatureProperty featureProperty = null; + List FeatureProperties = new ArrayList(); + try { + conn = this.getConnection(); + String selectDBQuery = + "SELECT PROPERTY_ID,PROPERTY, FEATURE_ID FROM MBL_FEATURE_PROPERTY WHERE FEATURE_ID = ?"; + stmt = conn.prepareStatement(selectDBQuery); + stmt.setString(1, featureId); + ResultSet resultSet = stmt.executeQuery(); + while (resultSet.next()) { + featureProperty = new FeatureProperty(); + featureProperty.setPropertyId(resultSet.getInt(1)); + featureProperty.setProperty(resultSet.getString(2)); + featureProperty.setFeatureID(resultSet.getString(3)); + FeatureProperties.add(featureProperty); + } + return FeatureProperties; + } catch (SQLException e) { + String msg = "Error occurred while fetching all feature property.'"; + log.error(msg, e); + throw new MobileDeviceManagementDAOException(msg, e); + } finally { + MobileDeviceManagementDAOUtil.cleanupResources(conn, stmt, null); + } + } + + private Connection getConnection() throws MobileDeviceManagementDAOException { + try { + return dataSource.getConnection(); + } catch (SQLException e) { + String msg = "Error occurred while obtaining a connection from the mobile device " + + "management metadata repository datasource."; + log.error(msg, e); + throw new MobileDeviceManagementDAOException(msg, e); + } + } +} diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.mobile.impl/src/main/java/org/wso2/carbon/device/mgt/mobile/dao/impl/MobileDeviceDAOImpl.java b/components/device-mgt/org.wso2.carbon.device.mgt.mobile.impl/src/main/java/org/wso2/carbon/device/mgt/mobile/dao/impl/MobileDeviceDAOImpl.java index f479d3b128f..66c547bdc54 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.mobile.impl/src/main/java/org/wso2/carbon/device/mgt/mobile/dao/impl/MobileDeviceDAOImpl.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.mobile.impl/src/main/java/org/wso2/carbon/device/mgt/mobile/dao/impl/MobileDeviceDAOImpl.java @@ -28,6 +28,8 @@ import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; /** * Implementation of MobileDeviceDAO. @@ -169,6 +171,39 @@ public class MobileDeviceDAOImpl implements MobileDeviceDAO { return status; } + @Override + public List getAllDevices() throws MobileDeviceManagementDAOException { + Connection conn = null; + PreparedStatement stmt = null; + MobileDevice mobileDevice; + List mobileDevices=new ArrayList(); + try { + conn = this.getConnection(); + String selectDBQuery = + "SELECT * FROM MBL_DEVICE"; + stmt = conn.prepareStatement(selectDBQuery); + ResultSet resultSet = stmt.executeQuery(); + while (resultSet.next()) { + mobileDevice = new MobileDevice(); + mobileDevice.setMobileDeviceId(resultSet.getString(1)); + mobileDevice.setRegId(resultSet.getString(2)); + mobileDevice.setImei(resultSet.getString(3)); + mobileDevice.setImsi(resultSet.getString(4)); + mobileDevice.setOsVersion(resultSet.getString(5)); + mobileDevice.setModel(resultSet.getString(6)); + mobileDevice.setVendor(resultSet.getString(7)); + mobileDevices.add(mobileDevice); + } + return mobileDevices; + } catch (SQLException e) { + String msg = "Error occurred while fetching all mobile device data'"; + log.error(msg, e); + throw new MobileDeviceManagementDAOException(msg, e); + } finally { + MobileDeviceManagementDAOUtil.cleanupResources(conn, stmt, null); + } + } + private Connection getConnection() throws MobileDeviceManagementDAOException { try { return dataSource.getConnection(); diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.mobile.impl/src/main/java/org/wso2/carbon/device/mgt/mobile/dao/impl/OperationDAOImpl.java b/components/device-mgt/org.wso2.carbon.device.mgt.mobile.impl/src/main/java/org/wso2/carbon/device/mgt/mobile/dao/impl/OperationDAOImpl.java new file mode 100644 index 00000000000..3e578690527 --- /dev/null +++ b/components/device-mgt/org.wso2.carbon.device.mgt.mobile.impl/src/main/java/org/wso2/carbon/device/mgt/mobile/dao/impl/OperationDAOImpl.java @@ -0,0 +1,151 @@ +package org.wso2.carbon.device.mgt.mobile.dao.impl; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.wso2.carbon.device.mgt.mobile.dao.MobileDeviceManagementDAOException; +import org.wso2.carbon.device.mgt.mobile.dao.OperationDAO; +import org.wso2.carbon.device.mgt.mobile.dao.util.MobileDeviceManagementDAOUtil; +import org.wso2.carbon.device.mgt.mobile.dto.Operation; + +import javax.sql.DataSource; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; + +/** + * Implementation of OperationDAO + */ +public class OperationDAOImpl implements OperationDAO { + + private DataSource dataSource; + private static final Log log = LogFactory.getLog(OperationDAOImpl.class); + + public OperationDAOImpl(DataSource dataSource) { + this.dataSource = dataSource; + } + + @Override + public boolean addOperation(Operation operation) + throws MobileDeviceManagementDAOException { + boolean status = false; + Connection conn = null; + PreparedStatement stmt = null; + try { + conn = this.getConnection(); + String createDBQuery = + "INSERT INTO MBL_OPERATION(FEATURE_CODE, CREATED_DATE) VALUES ( ?, ?)"; + + stmt = conn.prepareStatement(createDBQuery); + stmt.setString(1, operation.getFeatureCode()); + stmt.setInt(2, operation.getCreatedDate()); + int rows = stmt.executeUpdate(); + if (rows > 0) { + status = true; + } + } catch (SQLException e) { + String msg = "Error occurred while adding feature code - '" + + operation.getFeatureCode() + "' to operations table"; + log.error(msg, e); + throw new MobileDeviceManagementDAOException(msg, e); + } finally { + MobileDeviceManagementDAOUtil.cleanupResources(conn, stmt, null); + } + return status; + } + + @Override + public boolean updateOperation(Operation operation) + throws MobileDeviceManagementDAOException { + boolean status = false; + Connection conn = null; + PreparedStatement stmt = null; + try { + conn = this.getConnection(); + String updateDBQuery = + "UPDATE MBL_OPERATION SET FEATURE_CODE = ?, CREATED_DATE = ? WHERE OPERATION_ID = ?"; + stmt = conn.prepareStatement(updateDBQuery); + stmt.setString(1, operation.getFeatureCode()); + stmt.setInt(2, operation.getCreatedDate()); + stmt.setInt(3, operation.getOperationId()); + int rows = stmt.executeUpdate(); + if (rows > 0) { + status = true; + } + } catch (SQLException e) { + String msg = "Error occurred while updating the operation with operation id - '" + + operation.getOperationId() + "'"; + log.error(msg, e); + throw new MobileDeviceManagementDAOException(msg, e); + } finally { + MobileDeviceManagementDAOUtil.cleanupResources(conn, stmt, null); + } + return status; + } + + @Override + public boolean deleteOperation(int operationId) + throws MobileDeviceManagementDAOException { + boolean status = false; + Connection conn = null; + PreparedStatement stmt = null; + try { + conn = this.getConnection(); + String deleteDBQuery = + "DELETE FROM MBL_OPERATION WHERE OPERATION_ID = ?"; + stmt = conn.prepareStatement(deleteDBQuery); + stmt.setInt(1, operationId); + int rows = stmt.executeUpdate(); + if (rows > 0) { + status = true; + } + } catch (SQLException e) { + String msg = "Error occurred while deleting operation with operation Id - "; + log.error(msg, e); + throw new MobileDeviceManagementDAOException(msg, e); + } finally { + MobileDeviceManagementDAOUtil.cleanupResources(conn, stmt, null); + } + return status; + } + + @Override + public Operation getOperation(int operationId) + throws MobileDeviceManagementDAOException { + Connection conn = null; + PreparedStatement stmt = null; + Operation operation = null; + try { + conn = this.getConnection(); + String selectDBQuery = + "SELECT OPERATION_ID, FEATURE_CODE, CREATED_DATE FROM MBL_OPERATION WHERE OPERATION_ID = ?"; + stmt = conn.prepareStatement(selectDBQuery); + stmt.setInt(1, operation.getOperationId()); + ResultSet resultSet = stmt.executeQuery(); + while (resultSet.next()) { + operation = new Operation(); + operation.setOperationId(resultSet.getInt(1)); + break; + } + } catch (SQLException e) { + String msg = "Error occurred while fetching operationId - '" + + operationId + "'"; + log.error(msg, e); + throw new MobileDeviceManagementDAOException(msg, e); + } finally { + MobileDeviceManagementDAOUtil.cleanupResources(conn, stmt, null); + } + return operation; + } + + private Connection getConnection() throws MobileDeviceManagementDAOException { + try { + return dataSource.getConnection(); + } catch (SQLException e) { + String msg = "Error occurred while obtaining a connection from the mobile device " + + "management metadata repository datasource."; + log.error(msg, e); + throw new MobileDeviceManagementDAOException(msg, e); + } + } +} diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.mobile.impl/src/main/java/org/wso2/carbon/device/mgt/mobile/dao/impl/OperationPropertyDAOImpl.java b/components/device-mgt/org.wso2.carbon.device.mgt.mobile.impl/src/main/java/org/wso2/carbon/device/mgt/mobile/dao/impl/OperationPropertyDAOImpl.java new file mode 100644 index 00000000000..42ed4604b85 --- /dev/null +++ b/components/device-mgt/org.wso2.carbon.device.mgt.mobile.impl/src/main/java/org/wso2/carbon/device/mgt/mobile/dao/impl/OperationPropertyDAOImpl.java @@ -0,0 +1,87 @@ +package org.wso2.carbon.device.mgt.mobile.dao.impl; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.wso2.carbon.device.mgt.mobile.dao.MobileDeviceManagementDAOException; +import org.wso2.carbon.device.mgt.mobile.dao.OperationPropertyDAO; +import org.wso2.carbon.device.mgt.mobile.dao.util.MobileDeviceManagementDAOUtil; +import org.wso2.carbon.device.mgt.mobile.dto.OperationProperty; + +import javax.sql.DataSource; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; +import java.util.List; + +/** + * Implementation of OperationPropertyDAO + */ +public class OperationPropertyDAOImpl implements OperationPropertyDAO { + + private DataSource dataSource; + private static final Log log = LogFactory.getLog(OperationPropertyDAOImpl.class); + + public OperationPropertyDAOImpl(DataSource dataSource) { + this.dataSource = dataSource; + } + + @Override + public boolean addOperationProperty(OperationProperty operationProperty) + throws MobileDeviceManagementDAOException { + boolean status = false; + Connection conn = null; + PreparedStatement stmt = null; + try { + conn = this.getConnection(); + String createDBQuery = + "INSERT INTO MBL_OPERATION_PROPERTY(OPERATION_ID, PROPERTY_ID, VALUE) VALUES ( ?, ?, ?)"; + + stmt = conn.prepareStatement(createDBQuery); + stmt.setInt(1, operationProperty.getOperationId()); + stmt.setInt(2, operationProperty.getPropertyId()); + stmt.setString(3, operationProperty.getValue()); + int rows = stmt.executeUpdate(); + if (rows > 0) { + status = true; + } + } catch (SQLException e) { + String msg = "Error occurred while adding feature property to operation property table"; + log.error(msg, e); + throw new MobileDeviceManagementDAOException(msg, e); + } finally { + MobileDeviceManagementDAOUtil.cleanupResources(conn, stmt, null); + } + return status; + } + + @Override public boolean updateOperationProperty(OperationProperty operationProperty) + throws MobileDeviceManagementDAOException { + return false; + } + + @Override public boolean deleteOperationProperty(int operationPropertyId) + throws MobileDeviceManagementDAOException { + return false; + } + + @Override public OperationProperty getOperationProperty(String deviceId, int operationId) + throws MobileDeviceManagementDAOException { + return null; + } + + @Override public List getAllDeviceOperationOfDevice(String deviceId) + throws MobileDeviceManagementDAOException { + return null; + } + + private Connection getConnection() throws MobileDeviceManagementDAOException { + try { + return dataSource.getConnection(); + } catch (SQLException e) { + String msg = "Error occurred while obtaining a connection from the mobile device " + + "management metadata repository datasource."; + log.error(msg, e); + throw new MobileDeviceManagementDAOException(msg, e); + } + } +} diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.mobile.impl/src/main/java/org/wso2/carbon/device/mgt/mobile/dto/DeviceOperation.java b/components/device-mgt/org.wso2.carbon.device.mgt.mobile.impl/src/main/java/org/wso2/carbon/device/mgt/mobile/dto/DeviceOperation.java new file mode 100644 index 00000000000..84e55037423 --- /dev/null +++ b/components/device-mgt/org.wso2.carbon.device.mgt.mobile.impl/src/main/java/org/wso2/carbon/device/mgt/mobile/dto/DeviceOperation.java @@ -0,0 +1,44 @@ +package org.wso2.carbon.device.mgt.mobile.dto; + +/** + * DTO of Operations. + */ +public class DeviceOperation { + String deviceId; + int operationId; + int sentDate; + int receivedDate; + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public int getOperationId() { + return operationId; + } + + public void setOperationId(int operationId) { + this.operationId = operationId; + } + + public int getSentDate() { + return sentDate; + } + + public void setSentDate(int sentDate) { + this.sentDate = sentDate; + } + + public int getReceivedDate() { + return receivedDate; + } + + public void setReceivedDate(int receivedDate) { + this.receivedDate = receivedDate; + } + +} diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.mobile.impl/src/main/java/org/wso2/carbon/device/mgt/mobile/dto/Feature.java b/components/device-mgt/org.wso2.carbon.device.mgt.mobile.impl/src/main/java/org/wso2/carbon/device/mgt/mobile/dto/Feature.java new file mode 100644 index 00000000000..0c10e8eab95 --- /dev/null +++ b/components/device-mgt/org.wso2.carbon.device.mgt.mobile.impl/src/main/java/org/wso2/carbon/device/mgt/mobile/dto/Feature.java @@ -0,0 +1,46 @@ +package org.wso2.carbon.device.mgt.mobile.dto; + +import java.io.Serializable; + +/** + * DTO of features. + */ +public class Feature implements Serializable { + int id; + String code; + String name; + String description; + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + +} diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.mobile.impl/src/main/java/org/wso2/carbon/device/mgt/mobile/dto/FeatureProperty.java b/components/device-mgt/org.wso2.carbon.device.mgt.mobile.impl/src/main/java/org/wso2/carbon/device/mgt/mobile/dto/FeatureProperty.java new file mode 100644 index 00000000000..4f72e878e95 --- /dev/null +++ b/components/device-mgt/org.wso2.carbon.device.mgt.mobile.impl/src/main/java/org/wso2/carbon/device/mgt/mobile/dto/FeatureProperty.java @@ -0,0 +1,35 @@ +package org.wso2.carbon.device.mgt.mobile.dto; + +/** + * DTO of feature property. Represents a property of a feature. + */ +public class FeatureProperty { + int propertyId; + String property; + String featureID; + + public String getFeatureID() { + return featureID; + } + + public void setFeatureID(String featureID) { + this.featureID = featureID; + } + + public int getPropertyId() { + return propertyId; + } + + public void setPropertyId(int propertyId) { + this.propertyId = propertyId; + } + + public String getProperty() { + return property; + } + + public void setProperty(String property) { + this.property = property; + } + +} diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.mobile.impl/src/main/java/org/wso2/carbon/device/mgt/mobile/dto/Operation.java b/components/device-mgt/org.wso2.carbon.device.mgt.mobile.impl/src/main/java/org/wso2/carbon/device/mgt/mobile/dto/Operation.java new file mode 100644 index 00000000000..855ba6c6062 --- /dev/null +++ b/components/device-mgt/org.wso2.carbon.device.mgt.mobile.impl/src/main/java/org/wso2/carbon/device/mgt/mobile/dto/Operation.java @@ -0,0 +1,36 @@ +package org.wso2.carbon.device.mgt.mobile.dto; + +/** + * DTO of operation. + */ +public class Operation { + int operationId; + String featureCode; + int createdDate; + + public int getOperationId() { + return operationId; + } + + public void setOperationId(int operationId) { + this.operationId = operationId; + } + + public String getFeatureCode() { + return featureCode; + } + + public void setFeatureCode(String featureCode) { + this.featureCode = featureCode; + } + + public int getCreatedDate() { + return createdDate; + } + + public void setCreatedDate(int createdDate) { + this.createdDate = createdDate; + } + + +} diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.mobile.impl/src/main/java/org/wso2/carbon/device/mgt/mobile/dto/OperationProperty.java b/components/device-mgt/org.wso2.carbon.device.mgt.mobile.impl/src/main/java/org/wso2/carbon/device/mgt/mobile/dto/OperationProperty.java new file mode 100644 index 00000000000..2800807979b --- /dev/null +++ b/components/device-mgt/org.wso2.carbon.device.mgt.mobile.impl/src/main/java/org/wso2/carbon/device/mgt/mobile/dto/OperationProperty.java @@ -0,0 +1,44 @@ +package org.wso2.carbon.device.mgt.mobile.dto; + +/** + * DTO of operation property. + */ +public class OperationProperty { + int operationPropertyId; + int getOperationId; + int propertyId; + String value; + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public int getOperationPropertyId() { + return operationPropertyId; + } + + public void setOperationPropertyId(int operationPropertyId) { + this.operationPropertyId = operationPropertyId; + } + + public int getOperationId() { + return getOperationId; + } + + public void setOperationId(int getOperationId) { + this.getOperationId = getOperationId; + } + + public int getPropertyId() { + return propertyId; + } + + public void setPropertyId(int propertyId) { + this.propertyId = propertyId; + } + +} diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.mobile.impl/src/main/java/org/wso2/carbon/device/mgt/mobile/impl/android/AndroidDeviceManagerService.java b/components/device-mgt/org.wso2.carbon.device.mgt.mobile.impl/src/main/java/org/wso2/carbon/device/mgt/mobile/impl/android/AndroidDeviceManagerService.java index bf29c70cae8..b0feb672225 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.mobile.impl/src/main/java/org/wso2/carbon/device/mgt/mobile/impl/android/AndroidDeviceManagerService.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.mobile.impl/src/main/java/org/wso2/carbon/device/mgt/mobile/impl/android/AndroidDeviceManagerService.java @@ -25,6 +25,7 @@ import org.wso2.carbon.device.mgt.mobile.dao.MobileDeviceManagementDAOFactory; import org.wso2.carbon.device.mgt.mobile.dto.MobileDevice; import org.wso2.carbon.device.mgt.mobile.util.MobileDeviceManagementUtil; +import java.util.ArrayList; import java.util.List; /** @@ -33,11 +34,11 @@ import java.util.List; public class AndroidDeviceManagerService implements DeviceManagerService { private static final Log log = LogFactory.getLog(AndroidDeviceManagerService.class); - private OperationManager operationManager; + private OperationManager operationManager; - public AndroidDeviceManagerService() { - this.operationManager = new AndroidMobileOperationManager(); - } + public AndroidDeviceManagerService() { + this.operationManager = new AndroidMobileOperationManager(); + } @Override public String getProviderType() { @@ -64,7 +65,8 @@ public class AndroidDeviceManagerService implements DeviceManagerService { boolean status = false; MobileDevice mobileDevice = MobileDeviceManagementUtil.convertToMobileDevice(device); try { - status = MobileDeviceManagementDAOFactory.getMobileDeviceDAO().updateDevice(mobileDevice); + status = MobileDeviceManagementDAOFactory.getMobileDeviceDAO() + .updateDevice(mobileDevice); } catch (MobileDeviceManagementDAOException e) { String msg = "Error while updating the enrollment of the Android device : " + device.getDeviceIdentifier(); @@ -78,7 +80,8 @@ public class AndroidDeviceManagerService implements DeviceManagerService { public boolean disenrollDevice(DeviceIdentifier deviceId) throws DeviceManagementException { boolean status = false; try { - status = MobileDeviceManagementDAOFactory.getMobileDeviceDAO().deleteDevice(deviceId.getId()); + status = MobileDeviceManagementDAOFactory.getMobileDeviceDAO() + .deleteDevice(deviceId.getId()); } catch (MobileDeviceManagementDAOException e) { String msg = "Error while removing the Android device : " + deviceId.getId(); log.error(msg, e); @@ -94,7 +97,7 @@ public class AndroidDeviceManagerService implements DeviceManagerService { MobileDevice mobileDevice = MobileDeviceManagementDAOFactory.getMobileDeviceDAO().getDevice( deviceId.getId()); - if(mobileDevice!=null){ + if (mobileDevice != null) { isEnrolled = true; } } catch (MobileDeviceManagementDAOException e) { @@ -117,11 +120,6 @@ public class AndroidDeviceManagerService implements DeviceManagerService { return true; } - @Override - public List getAllDevices() throws DeviceManagementException { - return null; - } - @Override public Device getDevice(DeviceIdentifier deviceId) throws DeviceManagementException { Device device = null; @@ -143,23 +141,46 @@ public class AndroidDeviceManagerService implements DeviceManagerService { return true; } - @Override + @Override public boolean updateDeviceInfo(Device device) throws DeviceManagementException { boolean status = false; MobileDevice mobileDevice = MobileDeviceManagementUtil.convertToMobileDevice(device); try { - status = MobileDeviceManagementDAOFactory.getMobileDeviceDAO().updateDevice(mobileDevice); + status = MobileDeviceManagementDAOFactory.getMobileDeviceDAO() + .updateDevice(mobileDevice); } catch (MobileDeviceManagementDAOException e) { - String msg = "Error while updating the Android device : " + device.getDeviceIdentifier(); + String msg = + "Error while updating the Android device : " + device.getDeviceIdentifier(); log.error(msg, e); throw new DeviceManagementException(msg, e); } return status; } - @Override - public OperationManager getOperationManager() throws DeviceManagementException { - return operationManager; - } + @Override + public List getAllDevices() throws DeviceManagementException { + List devices = null; + try { + List mobileDevices = + MobileDeviceManagementDAOFactory.getMobileDeviceDAO(). + getAllDevices(); + if (mobileDevices != null) { + devices = new ArrayList(); + for (int x = 0; x < mobileDevices.size(); x++) { + devices.add(MobileDeviceManagementUtil.convertToDevice(mobileDevices.get(x))); + } + } + } catch (MobileDeviceManagementDAOException e) { + String msg = "Error while fetching all Android devices."; + log.error(msg, e); + throw new DeviceManagementException(msg, e); + } + return devices; + } + + @Override + public OperationManager getOperationManager() throws DeviceManagementException { + return operationManager; + } } \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.mobile.impl/src/main/java/org/wso2/carbon/device/mgt/mobile/internal/MobileDeviceManagementBundleActivator.java b/components/device-mgt/org.wso2.carbon.device.mgt.mobile.impl/src/main/java/org/wso2/carbon/device/mgt/mobile/internal/MobileDeviceManagementBundleActivator.java index e6eed7b7711..2d1fb04ad20 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.mobile.impl/src/main/java/org/wso2/carbon/device/mgt/mobile/internal/MobileDeviceManagementBundleActivator.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.mobile.impl/src/main/java/org/wso2/carbon/device/mgt/mobile/internal/MobileDeviceManagementBundleActivator.java @@ -133,7 +133,7 @@ public class MobileDeviceManagementBundleActivator implements BundleActivator, B private void initAPIConfigs() throws DeviceManagementException { List apiConfigs = MobileDeviceConfigurationManager.getInstance().getMobileDeviceManagementConfig(). - getApiPublisherConfig().getApis(); + getApiPublisherConfig().getAPIs(); for (APIConfig apiConfig : apiConfigs) { try { APIProvider provider = APIManagerFactory.getInstance().getAPIProvider(apiConfig.getOwner()); @@ -148,7 +148,7 @@ public class MobileDeviceManagementBundleActivator implements BundleActivator, B private void publishAPIs() throws DeviceManagementException { List apiConfigs = MobileDeviceConfigurationManager.getInstance().getMobileDeviceManagementConfig(). - getApiPublisherConfig().getApis(); + getApiPublisherConfig().getAPIs(); for (APIConfig apiConfig : apiConfigs) { DeviceManagementAPIPublisherUtil.publishAPI(apiConfig); } @@ -157,7 +157,7 @@ public class MobileDeviceManagementBundleActivator implements BundleActivator, B private void removeAPIs() throws DeviceManagementException { List apiConfigs = MobileDeviceConfigurationManager.getInstance().getMobileDeviceManagementConfig(). - getApiPublisherConfig().getApis(); + getApiPublisherConfig().getAPIs(); for (APIConfig apiConfig : apiConfigs) { DeviceManagementAPIPublisherUtil.removeAPI(apiConfig); } diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.mobile.impl/src/test/org/wso2/carbon/device/mgt/mobile/impl/common/DBTypes.java b/components/device-mgt/org.wso2.carbon.device.mgt.mobile.impl/src/test/org/wso2/carbon/device/mgt/mobile/impl/common/DBTypes.java new file mode 100644 index 00000000000..02258e96e7a --- /dev/null +++ b/components/device-mgt/org.wso2.carbon.device.mgt.mobile.impl/src/test/org/wso2/carbon/device/mgt/mobile/impl/common/DBTypes.java @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2014, 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.mobile.impl.common; + + +public enum DBTypes { + Oracle("Oracle"),H2("H2"),MySql("MySql"); + + String dbName ; + DBTypes(String dbStrName) { + dbName = dbStrName; + } +} diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.mobile.impl/src/test/org/wso2/carbon/device/mgt/mobile/impl/common/TestDBConfiguration.java b/components/device-mgt/org.wso2.carbon.device.mgt.mobile.impl/src/test/org/wso2/carbon/device/mgt/mobile/impl/common/TestDBConfiguration.java new file mode 100644 index 00000000000..3b40007e3e1 --- /dev/null +++ b/components/device-mgt/org.wso2.carbon.device.mgt.mobile.impl/src/test/org/wso2/carbon/device/mgt/mobile/impl/common/TestDBConfiguration.java @@ -0,0 +1,90 @@ +/* + * Copyright (c) 2014, 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.mobile.impl.common; + +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; + +@XmlRootElement(name = "DBType") +public class TestDBConfiguration { + + private String connectionUrl; + private String driverClass; + private String userName; + private String pwd; + + @Override public String toString() { + return "TestDBConfiguration{" + + "connectionUrl='" + connectionUrl + '\'' + + ", driverClass='" + driverClass + '\'' + + ", userName='" + userName + '\'' + + ", pwd='" + pwd + '\'' + + ", dbType='" + dbType + '\'' + + '}'; + } + + private String dbType; + + @XmlElement(name = "connectionurl", nillable = false) + public String getConnectionUrl() { + return connectionUrl; + } + + public void setConnectionUrl(String connectionUrl) { + this.connectionUrl = connectionUrl; + } + + @XmlElement(name = "driverclass", nillable = false) + public String getDriverClass() { + return driverClass; + } + + public void setDriverClass(String driverClass) { + this.driverClass = driverClass; + } + + @XmlElement(name = "userName", nillable = false) + public String getUserName() { + return userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + @XmlElement(name = "pwd", nillable = false) + public String getPwd() { + return pwd; + } + + public void setPwd(String pwd) { + this.pwd = pwd; + } + + @XmlAttribute(name = "typeName") + public String getDbType() { + return dbType; + } + + public void setDbType(String dbType) { + this.dbType = dbType; + } + +} diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.mobile.impl/src/test/org/wso2/carbon/device/mgt/mobile/impl/common/TestDBConfigurations.java b/components/device-mgt/org.wso2.carbon.device.mgt.mobile.impl/src/test/org/wso2/carbon/device/mgt/mobile/impl/common/TestDBConfigurations.java new file mode 100644 index 00000000000..42a6fcf4d54 --- /dev/null +++ b/components/device-mgt/org.wso2.carbon.device.mgt.mobile.impl/src/test/org/wso2/carbon/device/mgt/mobile/impl/common/TestDBConfigurations.java @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2014, 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.mobile.impl.common; + +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; +import java.util.List; + +@XmlRootElement(name = "DeviceMgtTestDBConfigurations") +public class TestDBConfigurations { + + private List dbTypesList; + + @XmlElement(name = "DBType") + public List getDbTypesList() { + return dbTypesList; + } + + public void setDbTypesList(List dbTypesList) { + this.dbTypesList = dbTypesList; + } + +} diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.mobile.impl/src/test/org/wso2/carbon/device/mgt/mobile/impl/dao/FeatureDAOTestSuite.java b/components/device-mgt/org.wso2.carbon.device.mgt.mobile.impl/src/test/org/wso2/carbon/device/mgt/mobile/impl/dao/FeatureDAOTestSuite.java new file mode 100644 index 00000000000..8bc07619bac --- /dev/null +++ b/components/device-mgt/org.wso2.carbon.device.mgt.mobile.impl/src/test/org/wso2/carbon/device/mgt/mobile/impl/dao/FeatureDAOTestSuite.java @@ -0,0 +1,143 @@ +/* + * Copyright (c) 2014, 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.mobile.impl.dao; + + +import org.apache.commons.dbcp.BasicDataSource; +import org.testng.Assert; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.Parameters; +import org.testng.annotations.Test; +import org.w3c.dom.Document; +import org.wso2.carbon.device.mgt.common.DeviceManagementException; +import org.wso2.carbon.device.mgt.mobile.impl.common.DBTypes; +import org.wso2.carbon.device.mgt.mobile.impl.common.TestDBConfiguration; +import org.wso2.carbon.device.mgt.mobile.impl.common.TestDBConfigurations; +import org.wso2.carbon.device.mgt.core.util.DeviceManagerUtil; +import org.wso2.carbon.device.mgt.mobile.dao.MobileDeviceManagementDAOException; +import org.wso2.carbon.device.mgt.mobile.dao.impl.FeatureDAOImpl; +import org.wso2.carbon.device.mgt.mobile.dto.*; + +import javax.xml.bind.JAXBContext; +import javax.xml.bind.JAXBException; +import javax.xml.bind.Unmarshaller; +import java.io.File; +import java.sql.*; +import java.util.Date; +import java.util.Iterator; + +public class FeatureDAOTestSuite { + + private TestDBConfiguration testDBConfiguration; + private Connection conn = null; + private Statement stmt = null; + private FeatureDAOImpl featureDAO; + + @BeforeClass + @Parameters("dbType") + public void setUpDB(String dbTypeStr) throws Exception { + + DBTypes dbType = DBTypes.valueOf(dbTypeStr); + testDBConfiguration = getTestDBConfiguration(dbType); + + switch (dbType) { + case H2: + createH2DB(testDBConfiguration); + BasicDataSource testDataSource = new BasicDataSource(); + testDataSource.setDriverClassName(testDBConfiguration.getDriverClass()); + testDataSource.setUrl(testDBConfiguration.getConnectionUrl()); + testDataSource.setUsername(testDBConfiguration.getUserName()); + testDataSource.setPassword(testDBConfiguration.getPwd()); + featureDAO = new FeatureDAOImpl(testDataSource); + default: + } + } + + private TestDBConfiguration getTestDBConfiguration(DBTypes dbType) throws + MobileDeviceManagementDAOException, + DeviceManagementException { + + File deviceMgtConfig = new File("src/test/resources/testdbconfig.xml"); + Document doc = null; + testDBConfiguration = null; + TestDBConfigurations testDBConfigurations = null; + + doc = DeviceManagerUtil.convertToDocument(deviceMgtConfig); + JAXBContext testDBContext = null; + + try { + testDBContext = JAXBContext.newInstance(TestDBConfigurations.class); + Unmarshaller unmarshaller = testDBContext.createUnmarshaller(); + testDBConfigurations = (TestDBConfigurations) unmarshaller.unmarshal(doc); + } catch (JAXBException e) { + throw new MobileDeviceManagementDAOException("Error parsing test db configurations", e); + } + + Iterator itrDBConfigs = testDBConfigurations.getDbTypesList().iterator(); + while (itrDBConfigs.hasNext()) { + testDBConfiguration = itrDBConfigs.next(); + if (testDBConfiguration.getDbType().equals(dbType.toString())) { + break; + } + } + + return testDBConfiguration; + } + + private void createH2DB(TestDBConfiguration testDBConf) throws Exception { + + Class.forName(testDBConf.getDriverClass()); + conn = DriverManager.getConnection(testDBConf.getConnectionUrl()); + stmt = conn.createStatement(); + stmt.executeUpdate("RUNSCRIPT FROM './src/test/resources/sql/CreateH2TestDB.sql'"); + stmt.close(); + conn.close(); + + } + + + @Test + public void addFeature() throws MobileDeviceManagementDAOException, DeviceManagementException { + + + + Feature feature = new Feature(); + feature.setCode("Camera"); + feature.setDescription("Camera enable or disable"); + feature.setName("Camera"); + boolean added = featureDAO.addFeature(feature); +// Long deviceId = null; +// try { +// conn = DeviceManagementDAOFactory.getDataSource().getConnection(); +// stmt = conn.createStatement(); +// ResultSet resultSet = stmt +// .executeQuery("SELECT ID from DM_DEVICE DEVICE where DEVICE.DEVICE_IDENTIFICATION='111'"); +// +// while (resultSet.next()) { +// deviceId = resultSet.getLong(1); +// } +// conn.close(); +// } catch (SQLException sqlEx) { +// throw new DeviceManagementDAOException("error in fetch device by device identification id", sqlEx); +// } + + Assert.assertTrue(added, "Device Id is null"); + } + +} diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.mobile.impl/src/test/resources/sql/CreateH2TestDB.sql b/components/device-mgt/org.wso2.carbon.device.mgt.mobile.impl/src/test/resources/sql/CreateH2TestDB.sql new file mode 100644 index 00000000000..afcd19ca06a --- /dev/null +++ b/components/device-mgt/org.wso2.carbon.device.mgt.mobile.impl/src/test/resources/sql/CreateH2TestDB.sql @@ -0,0 +1,24 @@ +CREATE TABLE IF NOT EXISTS DM_DEVICE_TYPE +( + ID INT auto_increment NOT NULL, + NAME VARCHAR(300) NULL DEFAULT NULL, + PRIMARY KEY (ID) +); + +CREATE TABLE IF NOT EXISTS DM_DEVICE +( + ID INT auto_increment NOT NULL, + DESCRIPTION TEXT NULL DEFAULT NULL, + NAME VARCHAR(100) NULL DEFAULT NULL, + DATE_OF_ENROLLMENT BIGINT NULL DEFAULT NULL, + DATE_OF_LAST_UPDATE BIGINT NULL DEFAULT NULL, + OWNERSHIP VARCHAR(45) NULL DEFAULT NULL, + STATUS VARCHAR(15) NULL DEFAULT NULL, + DEVICE_TYPE_ID INT(11) NULL DEFAULT NULL, + DEVICE_IDENTIFICATION VARCHAR(300) NULL DEFAULT NULL, + OWNER VARCHAR(45) NULL DEFAULT NULL, + TENANT_ID INTEGER DEFAULT 0, + PRIMARY KEY (ID), + CONSTRAINT fk_DM_DEVICE_DM_DEVICE_TYPE2 FOREIGN KEY (DEVICE_TYPE_ID ) + REFERENCES DM_DEVICE_TYPE (ID ) ON DELETE NO ACTION ON UPDATE NO ACTION +); \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.mobile.impl/src/test/resources/testdbconfig.xml b/components/device-mgt/org.wso2.carbon.device.mgt.mobile.impl/src/test/resources/testdbconfig.xml new file mode 100644 index 00000000000..34e89a1392f --- /dev/null +++ b/components/device-mgt/org.wso2.carbon.device.mgt.mobile.impl/src/test/resources/testdbconfig.xml @@ -0,0 +1,24 @@ + + + + + + jdbc:h2:mem:cdm-test-db;DB_CLOSE_DELAY=-1 + org.h2.Driver + + + + diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.mobile.impl/src/test/resources/testng.xml b/components/device-mgt/org.wso2.carbon.device.mgt.mobile.impl/src/test/resources/testng.xml new file mode 100644 index 00000000000..8bdba93ad7c --- /dev/null +++ b/components/device-mgt/org.wso2.carbon.device.mgt.mobile.impl/src/test/resources/testng.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/components/device-mgt/pom.xml b/components/device-mgt/pom.xml index 9611a638680..0254ac26871 100644 --- a/components/device-mgt/pom.xml +++ b/components/device-mgt/pom.xml @@ -42,6 +42,61 @@ org.wso2.carbon.device.mgt.mobile.impl + + diff --git a/features/device-mgt/org.wso2.carbon.device.mgt.mobile.feature/src/main/resources/conf/mobile-config.xml b/features/device-mgt/org.wso2.carbon.device.mgt.mobile.feature/src/main/resources/conf/mobile-config.xml index 7a3963fbdbe..bac7bdd5c89 100644 --- a/features/device-mgt/org.wso2.carbon.device.mgt.mobile.feature/src/main/resources/conf/mobile-config.xml +++ b/features/device-mgt/org.wso2.carbon.device.mgt.mobile.feature/src/main/resources/conf/mobile-config.xml @@ -19,19 +19,21 @@ - jdbc/WSO2MOBILE_DB + jdbc/MOBILE_MGT_DS - - enrollment - admin - enrollment - 1.0.0 - http://localhost:9763/ - http,https - + + + enrollment + admin + enrollment + 1.0.0 + http://localhost:9763/ + http,https + + diff --git a/features/device-mgt/org.wso2.carbon.device.mgt.server.feature/src/main/resources/conf/cdm-config.xml b/features/device-mgt/org.wso2.carbon.device.mgt.server.feature/src/main/resources/conf/cdm-config.xml index 1f7bca1d934..87176d63837 100644 --- a/features/device-mgt/org.wso2.carbon.device.mgt.server.feature/src/main/resources/conf/cdm-config.xml +++ b/features/device-mgt/org.wso2.carbon.device.mgt.server.feature/src/main/resources/conf/cdm-config.xml @@ -18,7 +18,7 @@ - jdbc/WSO2DEVICE_DB + jdbc/DEVICE_MGT_DS diff --git a/pom.xml b/pom.xml index 6178c374797..44542484c27 100644 --- a/pom.xml +++ b/pom.xml @@ -77,6 +77,7 @@ ${stub.version} test + org.wso2.carbon org.wso2.carbon.user.core @@ -93,11 +94,13 @@ org.wso2.carbon.user.api ${carbon.kernel.version} + org.wso2.carbon org.wso2.carbon.utils ${carbon.kernel.version} + org.wso2.carbon org.wso2.carbon.logging @@ -151,6 +154,11 @@ testng ${testng.version} + + org.wso2.carbon + org.wso2.carbon.utils + ${carbon.kernel.version} + org.wso2.carbon org.wso2.carbon.core @@ -166,6 +174,38 @@ org.wso2.carbon.ndatasource.rdbms ${carbon.kernel.version} + + org.wso2.carbon + org.wso2.carbon.transaction.manager + ${carbon.platform.version} + + + org.jboss.spec.javax.transaction + jboss-transaction-api_1.1_spec + ${jboss-transaction-api.version} + + + + + org.eclipse.osgi + org.eclipse.osgi + 3.8.1.v20120830-144521 + + + org.eclipse.equinox + org.eclipse.equinox.common + 3.6.100.v20120522-1841 + + + org.wso2.carbon + org.wso2.carbon.logging + ${carbon.kernel.version} + + + org.wso2.carbon + org.wso2.carbon.device.mgt.common + ${cdm.version} + org.eclipse.osgi org.eclipse.osgi.services diff --git a/product/modules/agents/android/client/src/org/wso2/cdm/agent/services/LocalNotification.java b/product/modules/agents/android/client/src/org/wso2/cdm/agent/services/LocalNotification.java new file mode 100644 index 00000000000..177cde22532 --- /dev/null +++ b/product/modules/agents/android/client/src/org/wso2/cdm/agent/services/LocalNotification.java @@ -0,0 +1,45 @@ +/** + * Copyright (c) 2014, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * 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. + */ +package org.wso2.cdm.agent.services; + +import android.app.AlarmManager; +import android.app.PendingIntent; +import android.content.Context; +import android.content.Intent; +import android.os.SystemClock; + +/** + * Local notification is a communication mechanism that essentially, + * polls to server based on a predefined to retrieve pending data. + */ +public class LocalNotification { + public static void startPolling(Context context) { + int interval=10000; +// int interval=Preference.getInt(context, context.getResources().getString(R.string.shared_pref_interval)); + //TODO:remove hard coded value + + long firstTime = SystemClock.elapsedRealtime(); + firstTime += 1000; + + Intent downloader = new Intent(context, AlarmReceiver.class); + PendingIntent recurringDownload = PendingIntent.getBroadcast(context, + 0, downloader, PendingIntent.FLAG_CANCEL_CURRENT); + AlarmManager alarms = (AlarmManager) context + .getSystemService(Context.ALARM_SERVICE); + alarms.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, firstTime, + interval, recurringDownload); + } +} diff --git a/product/modules/agents/android/jax-rs/src/main/webapp/WEB-INF/cxf-servlet.xml b/product/modules/agents/android/jax-rs/src/main/webapp/WEB-INF/cxf-servlet.xml index 7f7e753d170..ac8cda0d74c 100644 --- a/product/modules/agents/android/jax-rs/src/main/webapp/WEB-INF/cxf-servlet.xml +++ b/product/modules/agents/android/jax-rs/src/main/webapp/WEB-INF/cxf-servlet.xml @@ -51,15 +51,6 @@ - - - - - - - - - diff --git a/product/modules/distribution/pom.xml b/product/modules/distribution/pom.xml index b859527b8c0..8fbfc24aa94 100644 --- a/product/modules/distribution/pom.xml +++ b/product/modules/distribution/pom.xml @@ -34,6 +34,13 @@ WSO2 Connected Device Manager (CDM) - Distribution WSO2 Connected Device Manager (CDM) Distribution + + + com.h2database.wso2 + h2-database-engine + + + @@ -91,6 +98,40 @@ maven-antrun-plugin + + + create-idp-mgt-schema + package + + run + + + + + + + + + + + + + + + + + + + + + 3-extract-docs-from-components package @@ -149,7 +190,7 @@ package - + target/site @@ -120,6 +119,13 @@ **/trusted-idp-config.xml + + + ../p2-profile-gen/target/wso2carbon-core-${carbon.kernel.version}/repository/resources/rxts/ + + wso2cdm-${project.version}/repository/resources/rxts/ + + src/repository/conf/datasources wso2cdm-${project.version}/repository/conf/datasources @@ -142,7 +148,7 @@ 755 - ../p2-profile-gen/target/wso2carbon-core-${carbon.version}/lib/runtimes + ../p2-profile-gen/target/wso2carbon-core-${carbon.kernel.version}/lib/runtimes wso2cdm-${project.version}/lib/runtimes/ */** @@ -156,6 +162,16 @@ */** + + + + ../p2-profile-gen/target/wso2carbon-core-${carbon.kernel.version}/dbscripts/identity + wso2cdm-${project.version}/dbscripts/identity + + */** + + + ../p2-profile-gen/target/wso2carbon-core-${carbon.kernel.version}/repository/modules wso2cdm-${project.version}/modules/ @@ -173,7 +189,10 @@ */** - + + ../p2-profile-gen/target/wso2carbon-core-${carbon.kernel.version}/repository/resources + ${project.artifactId}-${project.version}/repository/resources + @@ -267,6 +286,38 @@ 644 + + + ../p2-profile-gen/target/wso2carbon-core-${carbon.kernel.version}/repository/conf/etc/logging-config.xml + wso2cdm-${project.version}/repository/conf/etc + true + 644 + + + + + ../p2-profile-gen/target/wso2carbon-core-${carbon.kernel.version}/repository/conf/event-broker.xml + wso2cdm-${project.version}/repository/conf + true + 644 + + + + + ../p2-profile-gen/target/wso2carbon-core-${carbon.kernel.version}/repository/conf/security/application-authentication.xml + wso2cdm-${project.version}/repository/conf/security + true + 644 + + + + + ../p2-profile-gen/target/wso2carbon-core-${carbon.kernel.version}/repository/conf/thrift-authentication.xml + wso2cdm-${project.version}/repository/conf + true + 644 + + - org.wso2.carbon:org.wso2.carbon.registry.extensions.feature:${carbon.platform.version} - org.wso2.carbon:org.wso2.carbon.registry.ws.feature:${carbon.platform.version} - org.wso2.carbon:org.wso2.carbon.registry.ui.menu.governance.feature:${carbon.platform.version} - - org.wso2.carbon:org.wso2.carbon.governance.metadata.feature:4.2.2 - org.wso2.carbon:org.wso2.carbon.governance.lifecycle.management.feature:4.2.1 - - - org.wso2.carbon:org.wso2.carbon.identity.core.server.feature:${carbon.platform.version} - - org.wso2.carbon:org.wso2.carbon.registry.associations.dependencies.server.feature:${carbon.platform.version} + org.wso2.carbon:org.wso2.carbon.identity.thrift.authentication.feature:${carbon.platform.version} - org.wso2.carbon:org.wso2.carbon.registry.community.features.server.feature:${carbon.platform.version} - - - org.wso2.carbon:org.wso2.carbon.registry.core.server.feature:${carbon.platform.version} - - - org.wso2.carbon:org.wso2.carbon.registry.core.common.feature:${carbon.platform.version} + org.wso2.carbon:org.wso2.carbon.identity.core.server.feature:${carbon.platform.version} org.wso2.carbon:org.wso2.carbon.logging.mgt.feature:${carbon.platform.version} @@ -199,15 +184,34 @@ org.wso2.carbon:org.wso2.carbon.idp.mgt.server.feature:${carbon.platform.version} - - org.wso2.carbon:org.wso2.carbon.idp.mgt.server.feature:${carbon.platform.version} - org.wso2.carbon:org.wso2.carbon.identity.user.profile.server.feature:${carbon.platform.version} org.wso2.carbon:org.wso2.carbon.identity.relying.party.server.feature:${carbon.platform.version} + + org.wso2.carbon:org.wso2.carbon.tenant.common.server.feature:${carbon.platform.version} + + + org.wso2.carbon:org.wso2.carbon.identity.authenticator.saml2.sso.server.feature:${carbon.platform.version} + + + + org.wso2.carbon:org.wso2.carbon.registry.core.feature:${carbon.platform.version} + org.wso2.carbon:org.wso2.carbon.registry.core.server.feature:${carbon.platform.version} + org.wso2.carbon:org.wso2.carbon.registry.ui.menu.feature:${carbon.platform.version} + org.wso2.carbon:org.wso2.carbon.registry.resource.properties.feature:${carbon.platform.version} + org.wso2.carbon:org.wso2.carbon.registry.associations.dependencies.feature:${carbon.platform.version} + org.wso2.carbon:org.wso2.carbon.registry.community.features.feature:${carbon.platform.version} + org.wso2.carbon:org.wso2.carbon.registry.community.features.server.feature:${carbon.platform.version} + org.wso2.carbon:org.wso2.carbon.registry.extensions.feature:${carbon.platform.version} + org.wso2.carbon:org.wso2.carbon.registry.ws.feature:${carbon.platform.version} + org.wso2.carbon:org.wso2.carbon.registry.ui.menu.governance.feature:${carbon.platform.version} + org.wso2.carbon:org.wso2.carbon.registry.contentsearch.feature:${carbon.platform.version} + + org.wso2.carbon:org.wso2.carbon.governance.metadata.feature:${carbon.platform.version} + org.wso2.carbon:org.wso2.carbon.governance.lifecycle.management.feature:${carbon.platform.version} @@ -230,14 +234,6 @@ org.wso2.carbon.apimgt.core.feature.group ${carbon.platform.version} - - org.wso2.carbon.device.mgt.server.feature.group ${project.version} @@ -280,6 +276,10 @@ org.wso2.carbon.um.ws.service.server.feature.group ${carbon.platform.version} + + org.wso2.carbon.user.mgt.server.feature.group + ${carbon.platform.version} + org.wso2.carbon.identity.oauth.server.feature.group ${carbon.platform.version} @@ -293,23 +293,59 @@ ${carbon.platform.version} - org.wso2.carbon.governance.metadata.server.feature.group + org.wso2.carbon.identity.thrift.authentication.feature.group ${carbon.platform.version} - org.wso2.carbon.registry.extensions.server.feature.group + org.wso2.carbon.identity.core.server.feature.group ${carbon.platform.version} - org.wso2.carbon.identity.core.server.feature.group + org.wso2.carbon.logging.mgt.feature.group ${carbon.platform.version} - org.wso2.carbon.registry.associations.dependencies.server.feature.group + org.wso2.carbon.event.server.feature.group ${carbon.platform.version} + - org.wso2.carbon.registry.community.features.server.feature.group + org.wso2.carbon.event.common.feature.group + ${carbon.platform.version} + + + org.wso2.carbon.databridge.datapublisher.feature.group + ${carbon.platform.version} + + + org.wso2.carbon.identity.application.authentication.framework.server.feature.group + ${carbon.platform.version} + + + org.wso2.carbon.idp.mgt.server.feature.group + ${carbon.platform.version} + + + org.wso2.carbon.identity.user.profile.server.feature.group + ${carbon.platform.version} + + + org.wso2.carbon.identity.relying.party.server.feature.group + ${carbon.platform.version} + + + org.wso2.carbon.tenant.common.server.feature.group + ${carbon.platform.version} + + + org.wso2.carbon.identity.authenticator.saml2.sso.server.feature.group + ${carbon.platform.version} + + + + + + org.wso2.carbon.registry.core.feature.group ${carbon.platform.version} @@ -317,48 +353,56 @@ ${carbon.platform.version} - org.wso2.carbon.registry.core.common.feature.group + org.wso2.carbon.registry.ui.menu.feature.group ${carbon.platform.version} + - org.wso2.carbon.logging.mgt.feature.group + org.wso2.carbon.registry.resource.properties.feature.group ${carbon.platform.version} + - org.wso2.carbon.event.server.feature.group + org.wso2.carbon.registry.associations.dependencies.feature.group + ${carbon.platform.version} + + + org.wso2.carbon.registry.community.features.feature.group ${carbon.platform.version} - org.wso2.carbon.event.common.feature.group + org.wso2.carbon.registry.community.features.server.feature.group ${carbon.platform.version} - org.wso2.carbon.databridge.datapublisher.feature.group + org.wso2.carbon.registry.ws.feature.group ${carbon.platform.version} + - - org.wso2.carbon.identity.application.authentication.framework.server.feature.group - + org.wso2.carbon.registry.extensions.feature.group ${carbon.platform.version} - org.wso2.carbon.idp.mgt.server.feature.group + org.wso2.carbon.registry.contentsearch.feature.group ${carbon.platform.version} + + + - org.wso2.carbon.identity.user.profile.server.feature.group + org.wso2.carbon.governance.metadata.feature.group ${carbon.platform.version} - org.wso2.carbon.identity.relying.party.server.feature.group + org.wso2.carbon.registry.ui.menu.governance.feature.group ${carbon.platform.version} - + diff --git a/product/pom.xml b/product/pom.xml index dfbfe94b77f..0d2fdedd5e9 100644 --- a/product/pom.xml +++ b/product/pom.xml @@ -7,7 +7,7 @@ ~ in compliance with the License. ~ You may obtain a copy of the License at ~ - ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ 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