Merge remote-tracking branch 'upstream/application-mgt-new' into application-mgt-new

# Conflicts:
#	components/application-mgt/org.wso2.carbon.device.application.mgt.store.ui/react-app/src/components/apps/release/install/DeviceInstall.js
feature/appm-store/pbac
Jayasanka 5 years ago
commit d8ce0ec746

@ -22,13 +22,13 @@
<parent> <parent>
<artifactId>apimgt-extensions</artifactId> <artifactId>apimgt-extensions</artifactId>
<groupId>org.wso2.carbon.devicemgt</groupId> <groupId>org.wso2.carbon.devicemgt</groupId>
<version>3.2.7-SNAPSHOT</version> <version>3.2.9-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath> <relativePath>../pom.xml</relativePath>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<artifactId>org.wso2.carbon.apimgt.annotations</artifactId> <artifactId>org.wso2.carbon.apimgt.annotations</artifactId>
<version>3.2.7-SNAPSHOT</version> <version>3.2.9-SNAPSHOT</version>
<packaging>bundle</packaging> <packaging>bundle</packaging>
<name>WSO2 Carbon - API Management Annotations</name> <name>WSO2 Carbon - API Management Annotations</name>
<description>WSO2 Carbon - API Management Custom Annotation Module</description> <description>WSO2 Carbon - API Management Custom Annotation Module</description>

@ -21,12 +21,12 @@
<parent> <parent>
<artifactId>apimgt-extensions</artifactId> <artifactId>apimgt-extensions</artifactId>
<groupId>org.wso2.carbon.devicemgt</groupId> <groupId>org.wso2.carbon.devicemgt</groupId>
<version>3.2.7-SNAPSHOT</version> <version>3.2.9-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath> <relativePath>../pom.xml</relativePath>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<version>3.2.7-SNAPSHOT</version> <version>3.2.9-SNAPSHOT</version>
<artifactId>org.wso2.carbon.apimgt.application.extension.api</artifactId> <artifactId>org.wso2.carbon.apimgt.application.extension.api</artifactId>
<packaging>war</packaging> <packaging>war</packaging>
<name>WSO2 Carbon - API Application Management API</name> <name>WSO2 Carbon - API Application Management API</name>

@ -22,12 +22,12 @@
<parent> <parent>
<artifactId>apimgt-extensions</artifactId> <artifactId>apimgt-extensions</artifactId>
<groupId>org.wso2.carbon.devicemgt</groupId> <groupId>org.wso2.carbon.devicemgt</groupId>
<version>3.2.7-SNAPSHOT</version> <version>3.2.9-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath> <relativePath>../pom.xml</relativePath>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<version>3.2.7-SNAPSHOT</version> <version>3.2.9-SNAPSHOT</version>
<artifactId>org.wso2.carbon.apimgt.application.extension</artifactId> <artifactId>org.wso2.carbon.apimgt.application.extension</artifactId>
<packaging>bundle</packaging> <packaging>bundle</packaging>
<name>WSO2 Carbon - API Application Management</name> <name>WSO2 Carbon - API Application Management</name>

@ -21,13 +21,13 @@
<parent> <parent>
<artifactId>apimgt-extensions</artifactId> <artifactId>apimgt-extensions</artifactId>
<groupId>org.wso2.carbon.devicemgt</groupId> <groupId>org.wso2.carbon.devicemgt</groupId>
<version>3.2.7-SNAPSHOT</version> <version>3.2.9-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath> <relativePath>../pom.xml</relativePath>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<artifactId>org.wso2.carbon.apimgt.handlers</artifactId> <artifactId>org.wso2.carbon.apimgt.handlers</artifactId>
<version>3.2.7-SNAPSHOT</version> <version>3.2.9-SNAPSHOT</version>
<packaging>bundle</packaging> <packaging>bundle</packaging>
<name>WSO2 Carbon - API Security Handler Component</name> <name>WSO2 Carbon - API Security Handler Component</name>
<description>WSO2 Carbon - API Management Security Handler Module</description> <description>WSO2 Carbon - API Management Security Handler Module</description>

@ -13,13 +13,13 @@
<parent> <parent>
<artifactId>apimgt-extensions</artifactId> <artifactId>apimgt-extensions</artifactId>
<groupId>org.wso2.carbon.devicemgt</groupId> <groupId>org.wso2.carbon.devicemgt</groupId>
<version>3.2.7-SNAPSHOT</version> <version>3.2.9-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath> <relativePath>../pom.xml</relativePath>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<artifactId>org.wso2.carbon.apimgt.integration.client</artifactId> <artifactId>org.wso2.carbon.apimgt.integration.client</artifactId>
<version>3.2.7-SNAPSHOT</version> <version>3.2.9-SNAPSHOT</version>
<packaging>bundle</packaging> <packaging>bundle</packaging>
<name>WSO2 Carbon - API Management Integration Client</name> <name>WSO2 Carbon - API Management Integration Client</name>
<description>WSO2 Carbon - API Management Integration Client</description> <description>WSO2 Carbon - API Management Integration Client</description>

@ -13,13 +13,13 @@
<parent> <parent>
<artifactId>apimgt-extensions</artifactId> <artifactId>apimgt-extensions</artifactId>
<groupId>org.wso2.carbon.devicemgt</groupId> <groupId>org.wso2.carbon.devicemgt</groupId>
<version>3.2.7-SNAPSHOT</version> <version>3.2.9-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath> <relativePath>../pom.xml</relativePath>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<artifactId>org.wso2.carbon.apimgt.integration.generated.client</artifactId> <artifactId>org.wso2.carbon.apimgt.integration.generated.client</artifactId>
<version>3.2.7-SNAPSHOT</version> <version>3.2.9-SNAPSHOT</version>
<packaging>bundle</packaging> <packaging>bundle</packaging>
<name>WSO2 Carbon - API Management Integration Generated Client</name> <name>WSO2 Carbon - API Management Integration Generated Client</name>
<description>WSO2 Carbon - API Management Integration Client</description> <description>WSO2 Carbon - API Management Integration Client</description>

@ -22,13 +22,13 @@
<parent> <parent>
<artifactId>apimgt-extensions</artifactId> <artifactId>apimgt-extensions</artifactId>
<groupId>org.wso2.carbon.devicemgt</groupId> <groupId>org.wso2.carbon.devicemgt</groupId>
<version>3.2.7-SNAPSHOT</version> <version>3.2.9-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath> <relativePath>../pom.xml</relativePath>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<artifactId>org.wso2.carbon.apimgt.webapp.publisher</artifactId> <artifactId>org.wso2.carbon.apimgt.webapp.publisher</artifactId>
<version>3.2.7-SNAPSHOT</version> <version>3.2.9-SNAPSHOT</version>
<packaging>bundle</packaging> <packaging>bundle</packaging>
<name>WSO2 Carbon - API Management Webapp Publisher</name> <name>WSO2 Carbon - API Management Webapp Publisher</name>
<description>WSO2 Carbon - API Management Webapp Publisher</description> <description>WSO2 Carbon - API Management Webapp Publisher</description>

@ -22,13 +22,13 @@
<parent> <parent>
<groupId>org.wso2.carbon.devicemgt</groupId> <groupId>org.wso2.carbon.devicemgt</groupId>
<artifactId>carbon-devicemgt</artifactId> <artifactId>carbon-devicemgt</artifactId>
<version>3.2.7-SNAPSHOT</version> <version>3.2.9-SNAPSHOT</version>
<relativePath>../../pom.xml</relativePath> <relativePath>../../pom.xml</relativePath>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<artifactId>apimgt-extensions</artifactId> <artifactId>apimgt-extensions</artifactId>
<version>3.2.7-SNAPSHOT</version> <version>3.2.9-SNAPSHOT</version>
<packaging>pom</packaging> <packaging>pom</packaging>
<name>WSO2 Carbon - API Management Extensions Component</name> <name>WSO2 Carbon - API Management Extensions Component</name>
<url>http://wso2.org</url> <url>http://wso2.org</url>

@ -5,12 +5,12 @@
<parent> <parent>
<artifactId>application-mgt</artifactId> <artifactId>application-mgt</artifactId>
<groupId>org.wso2.carbon.devicemgt</groupId> <groupId>org.wso2.carbon.devicemgt</groupId>
<version>3.2.7-SNAPSHOT</version> <version>3.2.9-SNAPSHOT</version>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<artifactId>org.wso2.carbon.device.application.mgt.addons</artifactId> <artifactId>org.wso2.carbon.device.application.mgt.addons</artifactId>
<version>3.2.7-SNAPSHOT</version> <version>3.2.9-SNAPSHOT</version>
<name>WSO2 Carbon - Application Management Add-Ons</name> <name>WSO2 Carbon - Application Management Add-Ons</name>
<description>WSO2 Carbon - Application Management Add-Ons</description> <description>WSO2 Carbon - Application Management Add-Ons</description>
<url>http://wso2.org</url> <url>http://wso2.org</url>

@ -22,13 +22,13 @@
<parent> <parent>
<artifactId>application-mgt</artifactId> <artifactId>application-mgt</artifactId>
<groupId>org.wso2.carbon.devicemgt</groupId> <groupId>org.wso2.carbon.devicemgt</groupId>
<version>3.2.7-SNAPSHOT</version> <version>3.2.9-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath> <relativePath>../pom.xml</relativePath>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<artifactId>org.wso2.carbon.device.application.mgt.api</artifactId> <artifactId>org.wso2.carbon.device.application.mgt.api</artifactId>
<version>3.2.7-SNAPSHOT</version> <version>3.2.9-SNAPSHOT</version>
<packaging>war</packaging> <packaging>war</packaging>
<name>WSO2 Carbon - Application Management API</name> <name>WSO2 Carbon - Application Management API</name>
<description>WSO2 Carbon - Application Management API</description> <description>WSO2 Carbon - Application Management API</description>

@ -57,7 +57,7 @@ import javax.ws.rs.core.Response;
public interface ArtifactDownloadAPI { public interface ArtifactDownloadAPI {
@GET @GET
@Path("/{uuid}/{fileName}") @Path("/{uuid}/{folderName}/{fileName}")
@Produces(MediaType.APPLICATION_OCTET_STREAM) @Produces(MediaType.APPLICATION_OCTET_STREAM)
@ApiOperation( @ApiOperation(
produces = MediaType.APPLICATION_OCTET_STREAM, produces = MediaType.APPLICATION_OCTET_STREAM,
@ -86,6 +86,11 @@ public interface ArtifactDownloadAPI {
value = "UUID of the application release.", value = "UUID of the application release.",
required = true) required = true)
@PathParam("uuid") String uuid, @PathParam("uuid") String uuid,
@ApiParam(
name = "folderName",
value = "Name of the folder where the artifact store.",
required = true)
@PathParam("folderName") String folderName,
@ApiParam( @ApiParam(
name = "fileName", name = "fileName",
value = "Name of the artifact", value = "Name of the artifact",

@ -47,12 +47,14 @@ public class ArtifactDownloadAPIImpl implements ArtifactDownloadAPI {
@GET @GET
@Override @Override
@Produces(MediaType.APPLICATION_OCTET_STREAM) @Produces(MediaType.APPLICATION_OCTET_STREAM)
@Path("/{uuid}/{fileName}") @Path("/{uuid}/{folderName}/{fileName}")
public Response getArtifact(@PathParam("uuid") String uuid, public Response getArtifact(
@PathParam("uuid") String uuid,
@PathParam("folderName") String folderName,
@PathParam("fileName") String fileName) { @PathParam("fileName") String fileName) {
AppmDataHandler dataHandler = APIUtil.getDataHandler(); AppmDataHandler dataHandler = APIUtil.getDataHandler();
try { try {
InputStream fileInputStream = dataHandler.getArtifactStream(uuid, fileName); InputStream fileInputStream = dataHandler.getArtifactStream(uuid, folderName, fileName);
Response.ResponseBuilder response = Response Response.ResponseBuilder response = Response
.ok(fileInputStream, MediaType.APPLICATION_OCTET_STREAM); .ok(fileInputStream, MediaType.APPLICATION_OCTET_STREAM);
response.status(Response.Status.OK); response.status(Response.Status.OK);

@ -21,13 +21,13 @@
<parent> <parent>
<groupId>org.wso2.carbon.devicemgt</groupId> <groupId>org.wso2.carbon.devicemgt</groupId>
<artifactId>application-mgt</artifactId> <artifactId>application-mgt</artifactId>
<version>3.2.7-SNAPSHOT</version> <version>3.2.9-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath> <relativePath>../pom.xml</relativePath>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<artifactId>org.wso2.carbon.device.application.mgt.common</artifactId> <artifactId>org.wso2.carbon.device.application.mgt.common</artifactId>
<version>3.2.7-SNAPSHOT</version> <version>3.2.9-SNAPSHOT</version>
<packaging>bundle</packaging> <packaging>bundle</packaging>
<name>WSO2 Carbon - Application Management Common</name> <name>WSO2 Carbon - Application Management Common</name>
<description>WSO2 Carbon - Application Management Common</description> <description>WSO2 Carbon - Application Management Common</description>

@ -0,0 +1,40 @@
/* Copyright (c) 2019, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved.
*
* Entgra (Pvt) Ltd. licenses this file to you under the Apache License,
* Version 2.0 (the "License"); you may not use this file except
* in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.wso2.carbon.device.application.mgt.common.config;
import javax.xml.bind.annotation.XmlElement;
public class MDMConfig {
private String artifactDownloadProtocol;
private String artifactDownloadEndpoint;
@XmlElement(name = "ArtifactDownloadProtocol", required=true)
public String getArtifactDownloadProtocol() { return artifactDownloadProtocol; }
public void setArtifactDownloadProtocol(String artifactDownloadProtocol) {
this.artifactDownloadProtocol = artifactDownloadProtocol;
}
@XmlElement(name = "ArtifactDownloadEndpoint", required=true)
public String getArtifactDownloadEndpoint() { return artifactDownloadEndpoint; }
public void setArtifactDownloadEndpoint(String artifactDownloadEndpoint) {
this.artifactDownloadEndpoint = artifactDownloadEndpoint;
}
}

@ -72,7 +72,7 @@ public interface ApplicationStorageManager {
* *
* @throws ApplicationStorageManagementException Not Found Exception. * @throws ApplicationStorageManagementException Not Found Exception.
*/ */
void deleteAppReleaseArtifact(String appReleaseHashVal, String fileName) throws ApplicationStorageManagementException; void deleteAppReleaseArtifact(String appReleaseHashVal, String folderName, String fileName) throws ApplicationStorageManagementException;
/** /**
* To delete all release artifacts related with particular ApplicationDTO Release. * To delete all release artifacts related with particular ApplicationDTO Release.
@ -84,9 +84,9 @@ public interface ApplicationStorageManager {
/*** /***
* Get the InputStream of the file which is located in filePath * Get the InputStream of the file which is located in filePath
* @param path file path * @param hashVal Hash Value of the application release.
* @return {@link InputStream} * @return {@link InputStream}
* @throws ApplicationStorageManagementException throws if an error occurs when accessing the file. * @throws ApplicationStorageManagementException throws if an error occurs when accessing the file.
*/ */
InputStream getFileSttream(String path) throws ApplicationStorageManagementException; InputStream getFileStream(String hashVal, String folderName, String fileName) throws ApplicationStorageManagementException;
} }

@ -35,5 +35,6 @@ public interface AppmDataHandler {
Map<String, LifecycleState> getLifecycleConfiguration() throws LifecycleManagementException; Map<String, LifecycleState> getLifecycleConfiguration() throws LifecycleManagementException;
InputStream getArtifactStream(String uuid, String artifactName) throws ApplicationManagementException; InputStream getArtifactStream(String uuid, String folderName, String artifactName)
throws ApplicationManagementException;
} }

@ -21,13 +21,13 @@
<parent> <parent>
<groupId>org.wso2.carbon.devicemgt</groupId> <groupId>org.wso2.carbon.devicemgt</groupId>
<artifactId>application-mgt</artifactId> <artifactId>application-mgt</artifactId>
<version>3.2.7-SNAPSHOT</version> <version>3.2.9-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath> <relativePath>../pom.xml</relativePath>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<artifactId>org.wso2.carbon.device.application.mgt.core</artifactId> <artifactId>org.wso2.carbon.device.application.mgt.core</artifactId>
<version>3.2.7-SNAPSHOT</version> <version>3.2.9-SNAPSHOT</version>
<packaging>bundle</packaging> <packaging>bundle</packaging>
<name>WSO2 Carbon - Application Management Core</name> <name>WSO2 Carbon - Application Management Core</name>
<description>WSO2 Carbon - Application Management Core</description> <description>WSO2 Carbon - Application Management Core</description>

@ -18,6 +18,7 @@
*/ */
package org.wso2.carbon.device.application.mgt.core.config; package org.wso2.carbon.device.application.mgt.core.config;
import org.wso2.carbon.device.application.mgt.common.config.MDMConfig;
import org.wso2.carbon.device.application.mgt.common.config.RatingConfiguration; import org.wso2.carbon.device.application.mgt.common.config.RatingConfiguration;
import org.wso2.carbon.device.application.mgt.common.config.UIConfiguration; import org.wso2.carbon.device.application.mgt.common.config.UIConfiguration;
import org.wso2.carbon.device.application.mgt.common.config.LifecycleState; import org.wso2.carbon.device.application.mgt.common.config.LifecycleState;
@ -37,20 +38,16 @@ public class Configuration {
private List<Extension> extensions; private List<Extension> extensions;
private Artifacts artifacts;
private PaginationConfiguration paginationConfiguration;
private List<LifecycleState> lifecycleStates; private List<LifecycleState> lifecycleStates;
private UIConfiguration uiConfiguration; private UIConfiguration uiConfiguration;
private List<String> appCategories; private List<String> appCategories;
private String artifactDownloadEndpoint;
private RatingConfiguration ratingConfiguration; private RatingConfiguration ratingConfiguration;
private MDMConfig mdmConfig;
@XmlElement(name = "DatasourceName", required = true) @XmlElement(name = "DatasourceName", required = true)
public String getDatasourceName() { public String getDatasourceName() {
return datasourceName; return datasourceName;
@ -70,11 +67,6 @@ public class Configuration {
this.extensions = extensions; this.extensions = extensions;
} }
@XmlElement(name = "PaginationConfiguration", required = true)
public PaginationConfiguration getPaginationConfiguration() {
return paginationConfiguration;
}
@XmlElementWrapper(name = "LifecycleStates") @XmlElementWrapper(name = "LifecycleStates")
@XmlElement(name = "LifecycleState") @XmlElement(name = "LifecycleState")
public List<LifecycleState> getLifecycleStates() { public List<LifecycleState> getLifecycleStates() {
@ -100,15 +92,6 @@ public class Configuration {
public void setRatingConfiguration( public void setRatingConfiguration(
RatingConfiguration ratingConfiguration) { this.ratingConfiguration = ratingConfiguration; } RatingConfiguration ratingConfiguration) { this.ratingConfiguration = ratingConfiguration; }
@XmlElement(name = "ArtifactDownloadEndpoint", required = true)
public String getArtifactDownloadEndpoint() {
return artifactDownloadEndpoint;
}
public void setArtifactDownloadEndpoint(String artifactDownloadEndpoint) {
this.artifactDownloadEndpoint = artifactDownloadEndpoint;
}
@XmlElementWrapper(name = "AppCategories") @XmlElementWrapper(name = "AppCategories")
@XmlElement(name = "Category") @XmlElement(name = "Category")
public List<String> getAppCategories() { public List<String> getAppCategories() {
@ -118,5 +101,12 @@ public class Configuration {
public void setAppCategories(List<String> appCategories) { public void setAppCategories(List<String> appCategories) {
this.appCategories = appCategories; this.appCategories = appCategories;
} }
@XmlElement(name = "MDMConfig", required = true)
public MDMConfig getMdmConfig() { return mdmConfig; }
public void setMdmConfig(MDMConfig mdmConfig) {
this.mdmConfig = mdmConfig;
}
} }

@ -77,7 +77,8 @@ public interface SubscriptionDAO {
void updateSubscriptions(int tenantId, String updateBy, List<String> paramList, void updateSubscriptions(int tenantId, String updateBy, List<String> paramList,
int releaseId, String subType, String action) throws ApplicationManagementDAOException; int releaseId, String subType, String action) throws ApplicationManagementDAOException;
List<Integer> getSubscribedDeviceIds(List<Integer> deviceIds, int tenantId) throws ApplicationManagementDAOException; List<Integer> getSubscribedDeviceIds(List<Integer> deviceIds, int applicationReleaseId, int tenantId)
throws ApplicationManagementDAOException;
List<Integer> getDeviceSubIdsForOperation (int operationId, int tenantId) throws ApplicationManagementDAOException; List<Integer> getDeviceSubIdsForOperation (int operationId, int tenantId) throws ApplicationManagementDAOException;

@ -533,7 +533,8 @@ public class GenericSubscriptionDAOImpl extends AbstractDAOImpl implements Subsc
} }
@Override @Override
public List<Integer> getSubscribedDeviceIds(List<Integer> deviceIds, int tenantId) public List<Integer> getSubscribedDeviceIds(List<Integer> deviceIds, int applicationReleaseId,
int tenantId)
throws ApplicationManagementDAOException { throws ApplicationManagementDAOException {
if (log.isDebugEnabled()) { if (log.isDebugEnabled()) {
log.debug("Request received to DAO Layer to get already subscribed dvice Ids for given list of device Ids."); log.debug("Request received to DAO Layer to get already subscribed dvice Ids for given list of device Ids.");
@ -545,14 +546,15 @@ public class GenericSubscriptionDAOImpl extends AbstractDAOImpl implements Subsc
StringJoiner joiner = new StringJoiner(",", StringJoiner joiner = new StringJoiner(",",
"SELECT DS.DM_DEVICE_ID " "SELECT DS.DM_DEVICE_ID "
+ "FROM AP_DEVICE_SUBSCRIPTION DS " + "FROM AP_DEVICE_SUBSCRIPTION DS "
+ "WHERE DS.DM_DEVICE_ID IN (", ") AND TENANT_ID = ?"); + "WHERE DS.DM_DEVICE_ID IN (", ") AND AP_APP_RELEASE_ID = ? AND TENANT_ID = ?");
deviceIds.stream().map(ignored -> "?").forEach(joiner::add); deviceIds.stream().map(ignored -> "?").forEach(joiner::add);
String query = joiner.toString(); String query = joiner.toString();
try (PreparedStatement ps = conn.prepareStatement(query)) { try (PreparedStatement ps = conn.prepareStatement(query)) {
for (Integer deviceId : deviceIds) { for (Integer deviceId : deviceIds) {
ps.setObject(index++, deviceId); ps.setObject(index++, deviceId);
} }
ps.setInt(index, tenantId); ps.setInt(index++, tenantId);
ps.setInt(index, applicationReleaseId);
try (ResultSet rs = ps.executeQuery()) { try (ResultSet rs = ps.executeQuery()) {
while (rs.next()) { while (rs.next()) {
subscribedDevices.add(rs.getInt("DM_DEVICE_ID")); subscribedDevices.add(rs.getInt("DM_DEVICE_ID"));

@ -32,6 +32,7 @@ import org.wso2.carbon.device.application.mgt.common.ApplicationInstaller;
import org.wso2.carbon.device.application.mgt.common.DeviceTypes; import org.wso2.carbon.device.application.mgt.common.DeviceTypes;
import org.wso2.carbon.device.application.mgt.common.LifecycleChanger; import org.wso2.carbon.device.application.mgt.common.LifecycleChanger;
import org.wso2.carbon.device.application.mgt.common.Pagination; import org.wso2.carbon.device.application.mgt.common.Pagination;
import org.wso2.carbon.device.application.mgt.common.config.MDMConfig;
import org.wso2.carbon.device.application.mgt.common.config.RatingConfiguration; import org.wso2.carbon.device.application.mgt.common.config.RatingConfiguration;
import org.wso2.carbon.device.application.mgt.common.dto.ApplicationDTO; import org.wso2.carbon.device.application.mgt.common.dto.ApplicationDTO;
import org.wso2.carbon.device.application.mgt.common.ApplicationList; import org.wso2.carbon.device.application.mgt.common.ApplicationList;
@ -451,12 +452,14 @@ public class ApplicationManagerImpl implements ApplicationManager {
ApplicationStorageManager applicationStorageManager = DAOUtil.getApplicationStorageManager(); ApplicationStorageManager applicationStorageManager = DAOUtil.getApplicationStorageManager();
if (!StringUtils.isEmpty(applicationArtifact.getIconName())) { if (!StringUtils.isEmpty(applicationArtifact.getIconName())) {
applicationStorageManager.deleteAppReleaseArtifact(applicationReleaseDTO.getAppHashValue(), applicationStorageManager
.deleteAppReleaseArtifact(applicationReleaseDTO.getAppHashValue(), Constants.ICON_ARTIFACT,
applicationReleaseDTO.getIconName()); applicationReleaseDTO.getIconName());
applicationReleaseDTO.setIconName(applicationArtifact.getIconName()); applicationReleaseDTO.setIconName(applicationArtifact.getIconName());
} }
if (!StringUtils.isEmpty(applicationArtifact.getBannerName())){ if (!StringUtils.isEmpty(applicationArtifact.getBannerName())){
applicationStorageManager.deleteAppReleaseArtifact(applicationReleaseDTO.getAppHashValue(), applicationStorageManager
.deleteAppReleaseArtifact(applicationReleaseDTO.getAppHashValue(), Constants.BANNER_ARTIFACT,
applicationReleaseDTO.getBannerName()); applicationReleaseDTO.getBannerName());
applicationReleaseDTO.setBannerName(applicationArtifact.getBannerName()); applicationReleaseDTO.setBannerName(applicationArtifact.getBannerName());
} }
@ -470,16 +473,20 @@ public class ApplicationManagerImpl implements ApplicationManager {
int counter = 1; int counter = 1;
for (String scName : screenshotNames) { for (String scName : screenshotNames) {
String folderPath = Constants.SCREENSHOT_ARTIFACT + counter;
if (counter == 1) { if (counter == 1) {
applicationStorageManager.deleteAppReleaseArtifact(applicationReleaseDTO.getAppHashValue(), applicationStorageManager
.deleteAppReleaseArtifact(applicationReleaseDTO.getAppHashValue(), folderPath,
applicationReleaseDTO.getScreenshotName1()); applicationReleaseDTO.getScreenshotName1());
applicationReleaseDTO.setScreenshotName1(scName); applicationReleaseDTO.setScreenshotName1(scName);
} else if (counter == 2) { } else if (counter == 2) {
applicationStorageManager.deleteAppReleaseArtifact(applicationReleaseDTO.getAppHashValue(), applicationStorageManager
.deleteAppReleaseArtifact(applicationReleaseDTO.getAppHashValue(), folderPath,
applicationReleaseDTO.getScreenshotName2()); applicationReleaseDTO.getScreenshotName2());
applicationReleaseDTO.setScreenshotName2(scName); applicationReleaseDTO.setScreenshotName2(scName);
} else if (counter == 3) { } else if (counter == 3) {
applicationStorageManager.deleteAppReleaseArtifact(applicationReleaseDTO.getAppHashValue(), applicationStorageManager
.deleteAppReleaseArtifact(applicationReleaseDTO.getAppHashValue(), folderPath,
applicationReleaseDTO.getScreenshotName3()); applicationReleaseDTO.getScreenshotName3());
applicationReleaseDTO.setScreenshotName3(scName); applicationReleaseDTO.setScreenshotName3(scName);
} }
@ -583,12 +590,14 @@ public class ApplicationManagerImpl implements ApplicationManager {
log.error(msg); log.error(msg);
throw new ApplicationManagementException(msg, e); throw new ApplicationManagementException(msg, e);
} catch (UserStoreException e) { } catch (UserStoreException e) {
throw new ApplicationManagementException( String msg = "User-store exception while checking whether the user " + userName + " of tenant " + tenantId
"User-store exception while checking whether the user " + userName + " of tenant " + tenantId + " has the publisher permission";
+ " has the publisher permission", e); log.error(msg);
throw new ApplicationManagementException(msg, e);
} catch (ApplicationManagementDAOException e) { } catch (ApplicationManagementDAOException e) {
throw new ApplicationManagementException( String msg = "DAO exception while getting applications for the user " + userName + " of tenant " + tenantId;
"DAO exception while getting applications for the user " + userName + " of tenant " + tenantId, e); log.error(msg);
throw new ApplicationManagementException(msg, e);
} finally { } finally {
ConnectionManagerUtil.closeDBConnection(); ConnectionManagerUtil.closeDBConnection();
} }
@ -792,23 +801,26 @@ public class ApplicationManagerImpl implements ApplicationManager {
ConnectionManagerUtil.commitDBTransaction(); ConnectionManagerUtil.commitDBTransaction();
return applicationRelease; return applicationRelease;
} catch (TransactionManagementException e) { } catch (TransactionManagementException e) {
throw new ApplicationManagementException( String msg = "Error occurred while staring application release creating transaction for application Id: "
"Error occurred while staring application release creating transaction for application Id: " + applicationId;
+ applicationId, e); log.error(msg);
throw new ApplicationManagementException(msg, e);
} catch (DBConnectionException e) { } catch (DBConnectionException e) {
throw new ApplicationManagementException( String msg = "Error occurred while adding application release into IoTS app management ApplicationDTO id of"
"Error occurred while adding application release into IoTS app management ApplicationDTO id of the " + " the application release: " + applicationId;
+ "application release: " + applicationId, e); log.error(msg);
throw new ApplicationManagementException(msg, e);
} catch (LifeCycleManagementDAOException e) { } catch (LifeCycleManagementDAOException e) {
ConnectionManagerUtil.rollbackDBTransaction(); ConnectionManagerUtil.rollbackDBTransaction();
throw new ApplicationManagementException( String msg = "Error occurred while adding new application release lifecycle state to the application"
"Error occurred while adding new application release lifecycle state to the application release: " + " release: " + applicationId;
+ applicationId, e); log.error(msg);
throw new ApplicationManagementException(msg, e);
} catch (ApplicationManagementDAOException e) { } catch (ApplicationManagementDAOException e) {
ConnectionManagerUtil.rollbackDBTransaction(); ConnectionManagerUtil.rollbackDBTransaction();
throw new ApplicationManagementException( String msg = "Error occurred while adding new application release for application " + applicationId;
"Error occurred while adding new application release for application " + applicationId, e); log.error(msg);
throw new ApplicationManagementException(msg, e);
} finally { } finally {
ConnectionManagerUtil.closeDBConnection(); ConnectionManagerUtil.closeDBConnection();
} }
@ -2857,14 +2869,8 @@ public class ApplicationManagerImpl implements ApplicationManager {
throw new NotFoundException(msg); throw new NotFoundException(msg);
} }
ApplicationReleaseDTO applicationReleaseDTO = applicationDTO.getApplicationReleaseDTOs().get(0); ApplicationReleaseDTO applicationReleaseDTO = applicationDTO.getApplicationReleaseDTOs().get(0);
String host = System.getProperty(Constants.IOT_HOST_PROPERTY); String artifactDownloadURL = APIUtil.getArtifactDownloadBaseURL() + applicationReleaseDTO.getUuid()
String port = System.getProperty(Constants.IOT_PORT_PROPERTY); + Constants.FORWARD_SLASH + applicationReleaseDTO.getInstallerName();
String artifactDownloadEndpoint = ConfigurationManager.getInstance().getConfiguration()
.getArtifactDownloadEndpoint();
String artifactDownloadURL =
Constants.ARTIFACT_DOWNLOAD_PROTOCOL + "://" + host + ":" + port + artifactDownloadEndpoint
+ Constants.FORWARD_SLASH + applicationReleaseDTO.getUuid() + Constants.FORWARD_SLASH
+ applicationReleaseDTO.getInstallerName();
String plistContent = "&lt;!DOCTYPE plist PUBLIC &quot;-//Apple//DTDPLIST1.0//EN&quot; &quot;" + String plistContent = "&lt;!DOCTYPE plist PUBLIC &quot;-//Apple//DTDPLIST1.0//EN&quot; &quot;" +
"http://www.apple.com/DTDs/PropertyList-1.0.dtd&quot;&gt;&lt;plist version=&quot;" + "http://www.apple.com/DTDs/PropertyList-1.0.dtd&quot;&gt;&lt;plist version=&quot;" +
"1.0&quot;&gt;&lt;dict&gt;&lt;key&gt;items&lt;/key&gt;&lt;array&gt;&lt;dict&gt;&lt;" + "1.0&quot;&gt;&lt;dict&gt;&lt;key&gt;items&lt;/key&gt;&lt;array&gt;&lt;dict&gt;&lt;" +

@ -30,6 +30,7 @@ import org.wso2.carbon.device.application.mgt.common.exception.ResourceManagemen
import org.wso2.carbon.device.application.mgt.common.services.ApplicationStorageManager; import org.wso2.carbon.device.application.mgt.common.services.ApplicationStorageManager;
import org.wso2.carbon.device.application.mgt.core.exception.ParsingException; import org.wso2.carbon.device.application.mgt.core.exception.ParsingException;
import org.wso2.carbon.device.application.mgt.core.util.ArtifactsParser; import org.wso2.carbon.device.application.mgt.core.util.ArtifactsParser;
import org.wso2.carbon.device.application.mgt.core.util.Constants;
import org.wso2.carbon.device.application.mgt.core.util.StorageManagementUtil; import org.wso2.carbon.device.application.mgt.core.util.StorageManagementUtil;
import java.io.*; import java.io.*;
@ -60,21 +61,24 @@ public class ApplicationStorageManagerImpl implements ApplicationStorageManager
public ApplicationReleaseDTO uploadImageArtifacts(ApplicationReleaseDTO applicationReleaseDTO, public ApplicationReleaseDTO uploadImageArtifacts(ApplicationReleaseDTO applicationReleaseDTO,
InputStream iconFileStream, InputStream bannerFileStream, List<InputStream> screenShotStreams) InputStream iconFileStream, InputStream bannerFileStream, List<InputStream> screenShotStreams)
throws ResourceManagementException { throws ResourceManagementException {
String artifactDirectoryPath;
String iconStoredLocation; String iconStoredLocation;
String bannerStoredLocation; String bannerStoredLocation;
String scStoredLocation = null; String scStoredLocation = null;
try { try {
artifactDirectoryPath = storagePath + applicationReleaseDTO.getAppHashValue(); String artifactStoringBaseDirPath = storagePath + applicationReleaseDTO.getAppHashValue();
StorageManagementUtil.createArtifactDirectory(artifactDirectoryPath); StorageManagementUtil.createArtifactDirectory(artifactStoringBaseDirPath);
if (iconFileStream != null) { if (iconFileStream != null) {
iconStoredLocation = artifactDirectoryPath + File.separator + applicationReleaseDTO.getIconName(); String iconStoringDir = artifactStoringBaseDirPath + File.separator + Constants.ICON_ARTIFACT;
StorageManagementUtil.createArtifactDirectory(iconStoringDir);
iconStoredLocation = iconStoringDir + File.separator + applicationReleaseDTO.getIconName();
saveFile(iconFileStream, iconStoredLocation); saveFile(iconFileStream, iconStoredLocation);
} }
if (bannerFileStream != null) { if (bannerFileStream != null) {
bannerStoredLocation = artifactDirectoryPath + File.separator + applicationReleaseDTO.getBannerName(); String bannerStoringDir = artifactStoringBaseDirPath + File.separator + Constants.BANNER_ARTIFACT;
StorageManagementUtil.createArtifactDirectory(bannerStoringDir);
bannerStoredLocation = bannerStoringDir + File.separator + applicationReleaseDTO.getBannerName();
saveFile(bannerFileStream, bannerStoredLocation); saveFile(bannerFileStream, bannerStoredLocation);
} }
if (!screenShotStreams.isEmpty()) { if (!screenShotStreams.isEmpty()) {
@ -86,14 +90,16 @@ public class ApplicationStorageManagerImpl implements ApplicationStorageManager
} }
int count = 1; int count = 1;
for (InputStream screenshotStream : screenShotStreams) { for (InputStream screenshotStream : screenShotStreams) {
String scStoringDir = artifactStoringBaseDirPath + File.separator + Constants.SCREENSHOT_ARTIFACT + count;
StorageManagementUtil.createArtifactDirectory(scStoringDir);
if (count == 1) { if (count == 1) {
scStoredLocation = artifactDirectoryPath + File.separator + applicationReleaseDTO.getScreenshotName1(); scStoredLocation = scStoringDir + File.separator + applicationReleaseDTO.getScreenshotName1();
} }
if (count == 2) { if (count == 2) {
scStoredLocation = artifactDirectoryPath + File.separator + applicationReleaseDTO.getScreenshotName2(); scStoredLocation = scStoringDir + File.separator + applicationReleaseDTO.getScreenshotName2();
} }
if (count == 3) { if (count == 3) {
scStoredLocation = artifactDirectoryPath + File.separator + applicationReleaseDTO.getScreenshotName3(); scStoredLocation = scStoringDir + File.separator + applicationReleaseDTO.getScreenshotName3();
} }
saveFile(screenshotStream, scStoredLocation); saveFile(screenshotStream, scStoredLocation);
count++; count++;
@ -101,8 +107,10 @@ public class ApplicationStorageManagerImpl implements ApplicationStorageManager
} }
return applicationReleaseDTO; return applicationReleaseDTO;
} catch (IOException e) { } catch (IOException e) {
throw new ApplicationStorageManagementException("IO Exception while saving the screens hots for " + String msg = "IO Exception occurred while saving application artifacts for the application which has UUID "
"the application " + applicationReleaseDTO.getUuid(), e); + applicationReleaseDTO.getUuid();
log.error(msg);
throw new ApplicationStorageManagementException(msg, e);
} }
} }
@ -142,7 +150,8 @@ public class ApplicationStorageManagerImpl implements ApplicationStorageManager
String artifactPath; String artifactPath;
byte [] content = IOUtils.toByteArray(binaryFile); byte [] content = IOUtils.toByteArray(binaryFile);
artifactDirectoryPath = storagePath + applicationReleaseDTO.getAppHashValue(); artifactDirectoryPath =
storagePath + applicationReleaseDTO.getAppHashValue() + File.separator + Constants.APP_ARTIFACT;
StorageManagementUtil.createArtifactDirectory(artifactDirectoryPath); StorageManagementUtil.createArtifactDirectory(artifactDirectoryPath);
artifactPath = artifactDirectoryPath + File.separator + applicationReleaseDTO.getInstallerName(); artifactPath = artifactDirectoryPath + File.separator + applicationReleaseDTO.getInstallerName();
saveFile(new ByteArrayInputStream(content), artifactPath); saveFile(new ByteArrayInputStream(content), artifactPath);
@ -168,24 +177,38 @@ public class ApplicationStorageManagerImpl implements ApplicationStorageManager
String screenshot3 = applicationReleaseDTO.getScreenshotName3(); String screenshot3 = applicationReleaseDTO.getScreenshotName3();
if (bannerName != null) { if (bannerName != null) {
StorageManagementUtil.copy(storagePath + deletingAppHashValue + File.separator + bannerName, StorageManagementUtil
storagePath + appHashValue + File.separator + bannerName); .copy(storagePath + deletingAppHashValue + File.separator + Constants.BANNER_ARTIFACT
+ File.separator + bannerName,
storagePath + appHashValue + File.separator + Constants.BANNER_ARTIFACT + File.separator
+ bannerName);
} }
if (iconName != null) { if (iconName != null) {
StorageManagementUtil.copy(storagePath + deletingAppHashValue + File.separator + iconName, StorageManagementUtil.copy(storagePath + deletingAppHashValue + File.separator + Constants.ICON_ARTIFACT
storagePath + appHashValue + File.separator + iconName); + File.separator + iconName,
storagePath + appHashValue + File.separator + Constants.ICON_ARTIFACT + File.separator
+ iconName);
} }
if (screenshot1 != null) { if (screenshot1 != null) {
StorageManagementUtil.copy(storagePath + deletingAppHashValue + File.separator + screenshot1, StorageManagementUtil
storagePath + appHashValue + File.separator + screenshot1); .copy(storagePath + deletingAppHashValue + File.separator + Constants.SCREENSHOT_ARTIFACT + 1
+ File.separator + screenshot1,
storagePath + appHashValue + File.separator + Constants.SCREENSHOT_ARTIFACT + 1
+ File.separator + screenshot1);
} }
if (screenshot2 != null) { if (screenshot2 != null) {
StorageManagementUtil.copy(storagePath + deletingAppHashValue + File.separator + screenshot2, StorageManagementUtil
storagePath + appHashValue + File.separator + screenshot2); .copy(storagePath + deletingAppHashValue + File.separator + Constants.SCREENSHOT_ARTIFACT + 2
+ File.separator + screenshot2,
storagePath + appHashValue + File.separator + Constants.SCREENSHOT_ARTIFACT + 2
+ File.separator + screenshot2);
} }
if (screenshot3 != null) { if (screenshot3 != null) {
StorageManagementUtil.copy(storagePath + deletingAppHashValue + File.separator + screenshot3, StorageManagementUtil
storagePath + appHashValue + File.separator + screenshot3); .copy(storagePath + deletingAppHashValue + File.separator + Constants.SCREENSHOT_ARTIFACT + 3
+ File.separator + screenshot3,
storagePath + appHashValue + File.separator + Constants.SCREENSHOT_ARTIFACT + 3
+ File.separator + screenshot3);
} }
deleteAppReleaseArtifact( storagePath + deletingAppHashValue); deleteAppReleaseArtifact( storagePath + deletingAppHashValue);
} catch (IOException e) { } catch (IOException e) {
@ -198,8 +221,9 @@ public class ApplicationStorageManagerImpl implements ApplicationStorageManager
@Override @Override
public void deleteAppReleaseArtifact(String appReleaseHashVal, String fileName) throws ApplicationStorageManagementException { public void deleteAppReleaseArtifact(String appReleaseHashVal, String folderName, String fileName)
String artifactPath = storagePath + appReleaseHashVal + File.separator + fileName; throws ApplicationStorageManagementException {
String artifactPath = storagePath + appReleaseHashVal + File.separator + folderName + File.separator + fileName;
deleteAppReleaseArtifact(artifactPath); deleteAppReleaseArtifact(artifactPath);
} }
@ -212,8 +236,9 @@ public class ApplicationStorageManagerImpl implements ApplicationStorageManager
} }
@Override @Override
public InputStream getFileSttream (String path) throws ApplicationStorageManagementException { public InputStream getFileStream(String hashVal, String folderName, String fileName)
String filePath = storagePath + path; throws ApplicationStorageManagementException {
String filePath = storagePath + hashVal + File.separator + folderName + File.separator + fileName;
try { try {
return StorageManagementUtil.getInputStream(filePath); return StorageManagementUtil.getInputStream(filePath);
} catch (IOException e) { } catch (IOException e) {

@ -64,12 +64,11 @@ public class AppmDataHandlerImpl implements AppmDataHandler {
return lifecycleStateManager.getLifecycleConfig(); return lifecycleStateManager.getLifecycleConfig();
} }
@Override @Override public InputStream getArtifactStream(String uuid, String folderName, String artifactName)
public InputStream getArtifactStream(String uuid, String artifactName) throws ApplicationManagementException { throws ApplicationManagementException {
int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true); int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true);
ApplicationStorageManager applicationStorageManager = DAOUtil.getApplicationStorageManager(); ApplicationStorageManager applicationStorageManager = DAOUtil.getApplicationStorageManager();
ApplicationReleaseDAO applicationReleaseDAO = ApplicationManagementDAOFactory.getApplicationReleaseDAO(); ApplicationReleaseDAO applicationReleaseDAO = ApplicationManagementDAOFactory.getApplicationReleaseDAO();
String artifactPath;
String appReleaseHashValue; String appReleaseHashValue;
try { try {
ConnectionManagerUtil.openDBConnection(); ConnectionManagerUtil.openDBConnection();
@ -79,10 +78,10 @@ public class AppmDataHandlerImpl implements AppmDataHandler {
log.error(msg); log.error(msg);
throw new NotFoundException(msg); throw new NotFoundException(msg);
} }
artifactPath = appReleaseHashValue + Constants.FORWARD_SLASH + artifactName; InputStream inputStream = applicationStorageManager
InputStream inputStream = applicationStorageManager.getFileSttream(artifactPath); .getFileStream(appReleaseHashValue, folderName, artifactName);
if (inputStream == null) { if (inputStream == null) {
String msg = "Couldn't file the file in the file system. File path: " + artifactPath; String msg = "Couldn't file the file in the file system.";
log.error(msg); log.error(msg);
throw new ApplicationManagementException(msg); throw new ApplicationManagementException(msg);
} }

@ -27,6 +27,7 @@ import org.wso2.carbon.device.application.mgt.common.DeviceTypes;
import org.wso2.carbon.device.application.mgt.common.SubAction; import org.wso2.carbon.device.application.mgt.common.SubAction;
import org.wso2.carbon.device.application.mgt.common.SubsciptionType; import org.wso2.carbon.device.application.mgt.common.SubsciptionType;
import org.wso2.carbon.device.application.mgt.common.SubscribingDeviceIdHolder; import org.wso2.carbon.device.application.mgt.common.SubscribingDeviceIdHolder;
import org.wso2.carbon.device.application.mgt.common.config.MDMConfig;
import org.wso2.carbon.device.application.mgt.common.dto.ApplicationDTO; import org.wso2.carbon.device.application.mgt.common.dto.ApplicationDTO;
import org.wso2.carbon.device.application.mgt.common.dto.DeviceSubscriptionDTO; import org.wso2.carbon.device.application.mgt.common.dto.DeviceSubscriptionDTO;
import org.wso2.carbon.device.application.mgt.common.exception.ApplicationManagementException; import org.wso2.carbon.device.application.mgt.common.exception.ApplicationManagementException;
@ -335,36 +336,38 @@ public class SubscriptionManagerImpl implements SubscriptionManager {
ConnectionManagerUtil.beginDBTransaction(); ConnectionManagerUtil.beginDBTransaction();
List<Integer> deviceSubIds = new ArrayList<>(); List<Integer> deviceSubIds = new ArrayList<>();
List<String> subscribedEntities = new ArrayList<>();
if (SubsciptionType.USER.toString().equalsIgnoreCase(subType)) { if (SubsciptionType.USER.toString().equalsIgnoreCase(subType)) {
subscribedEntities = subscriptionDAO.getSubscribedUserNames(params, tenantId); List<String> subscribedEntities = subscriptionDAO.getSubscribedUserNames(params, tenantId);
if (SubAction.INSTALL.toString().equalsIgnoreCase(action)) { if (SubAction.INSTALL.toString().equalsIgnoreCase(action)) {
params.removeAll(subscribedEntities); params.removeAll(subscribedEntities);
subscriptionDAO.addUserSubscriptions(tenantId, username, params, applicationReleaseId); subscriptionDAO.addUserSubscriptions(tenantId, username, params, applicationReleaseId);
} }
subscriptionDAO.updateSubscriptions(tenantId, username, subscribedEntities, applicationReleaseId, subType,
action);
} else if (SubsciptionType.ROLE.toString().equalsIgnoreCase(subType)) { } else if (SubsciptionType.ROLE.toString().equalsIgnoreCase(subType)) {
subscribedEntities = subscriptionDAO.getSubscribedRoleNames(params, tenantId); List<String> subscribedEntities = subscriptionDAO.getSubscribedRoleNames(params, tenantId);
if (SubAction.INSTALL.toString().equalsIgnoreCase(action)) { if (SubAction.INSTALL.toString().equalsIgnoreCase(action)) {
params.removeAll(subscribedEntities); params.removeAll(subscribedEntities);
subscriptionDAO.addRoleSubscriptions(tenantId, username, params, applicationReleaseId); subscriptionDAO.addRoleSubscriptions(tenantId, username, params, applicationReleaseId);
} }
subscriptionDAO.updateSubscriptions(tenantId, username, subscribedEntities, applicationReleaseId, subType,
action);
} else if (SubsciptionType.GROUP.toString().equalsIgnoreCase(subType)) { } else if (SubsciptionType.GROUP.toString().equalsIgnoreCase(subType)) {
subscribedEntities = subscriptionDAO.getSubscribedGroupNames(params, tenantId); List<String> subscribedEntities = subscriptionDAO.getSubscribedGroupNames(params, tenantId);
if (SubAction.INSTALL.toString().equalsIgnoreCase(action)) { if (SubAction.INSTALL.toString().equalsIgnoreCase(action)) {
params.removeAll(subscribedEntities); params.removeAll(subscribedEntities);
subscriptionDAO.addGroupSubscriptions(tenantId, username, params, applicationReleaseId); subscriptionDAO.addGroupSubscriptions(tenantId, username, params, applicationReleaseId);
} }
}
subscriptionDAO.updateSubscriptions(tenantId, username, subscribedEntities, applicationReleaseId, subType, subscriptionDAO.updateSubscriptions(tenantId, username, subscribedEntities, applicationReleaseId, subType,
action); action);
}
for (Activity activity : activities) { for (Activity activity : activities) {
int operationId = Integer.parseInt(activity.getActivityId().split("ACTIVITY_")[1]); int operationId = Integer.parseInt(activity.getActivityId().split("ACTIVITY_")[1]);
List<Integer> operationAddedDeviceIds = getOperationAddedDeviceIds(activity, List<Integer> operationAddedDeviceIds = getOperationAddedDeviceIds(activity,
subscribingDeviceIdHolder.getSubscribableDevices()); subscribingDeviceIdHolder.getSubscribableDevices());
List<Integer> alreadySubscribedDevices = subscriptionDAO List<Integer> alreadySubscribedDevices = subscriptionDAO
.getSubscribedDeviceIds(operationAddedDeviceIds, tenantId); .getSubscribedDeviceIds(operationAddedDeviceIds, applicationReleaseId, tenantId);
if (SubAction.INSTALL.toString().equalsIgnoreCase(action)) { if (SubAction.INSTALL.toString().equalsIgnoreCase(action)) {
if (!alreadySubscribedDevices.isEmpty()) { if (!alreadySubscribedDevices.isEmpty()) {
List<Integer> deviceResubscribingIds = subscriptionDAO List<Integer> deviceResubscribingIds = subscriptionDAO
@ -478,14 +481,9 @@ public class SubscriptionManagerImpl implements SubscriptionManager {
} }
} else if (DeviceTypes.IOS.toString().equalsIgnoreCase(deviceType)) { } else if (DeviceTypes.IOS.toString().equalsIgnoreCase(deviceType)) {
if (SubAction.INSTALL.toString().equalsIgnoreCase(action)) { if (SubAction.INSTALL.toString().equalsIgnoreCase(action)) {
String host = System.getProperty(Constants.IOT_HOST_PROPERTY); String plistDownloadEndpoint = APIUtil.getArtifactDownloadBaseURL()
String port = System.getProperty(Constants.IOT_PORT_PROPERTY); + MDMAppConstants.IOSConstants.PLIST + Constants.FORWARD_SLASH
String artifactDownloadEndpoint = ConfigurationManager.getInstance().getConfiguration() + application.getApplicationReleases().get(0).getUuid();
.getArtifactDownloadEndpoint();
String plistDownloadEndpoint =
Constants.ARTIFACT_DOWNLOAD_PROTOCOL + "://" + host + ":" + port + artifactDownloadEndpoint
+ Constants.FORWARD_SLASH + MDMAppConstants.IOSConstants.PLIST
+ Constants.FORWARD_SLASH + application.getApplicationReleases().get(0).getUuid();
mobileApp.setType(mobileAppType); mobileApp.setType(mobileAppType);
mobileApp.setLocation(plistDownloadEndpoint); mobileApp.setLocation(plistDownloadEndpoint);
Properties properties = new Properties(); Properties properties = new Properties();

@ -24,8 +24,10 @@ import org.apache.commons.logging.LogFactory;
import org.apache.commons.validator.routines.UrlValidator; import org.apache.commons.validator.routines.UrlValidator;
import org.wso2.carbon.context.PrivilegedCarbonContext; import org.wso2.carbon.context.PrivilegedCarbonContext;
import org.wso2.carbon.device.application.mgt.common.ApplicationType; import org.wso2.carbon.device.application.mgt.common.ApplicationType;
import org.wso2.carbon.device.application.mgt.common.config.MDMConfig;
import org.wso2.carbon.device.application.mgt.common.dto.ApplicationDTO; import org.wso2.carbon.device.application.mgt.common.dto.ApplicationDTO;
import org.wso2.carbon.device.application.mgt.common.dto.ApplicationReleaseDTO; import org.wso2.carbon.device.application.mgt.common.dto.ApplicationReleaseDTO;
import org.wso2.carbon.device.application.mgt.common.exception.ApplicationManagementException;
import org.wso2.carbon.device.application.mgt.common.response.Application; import org.wso2.carbon.device.application.mgt.common.response.Application;
import org.wso2.carbon.device.application.mgt.common.response.ApplicationRelease; import org.wso2.carbon.device.application.mgt.common.response.ApplicationRelease;
import org.wso2.carbon.device.application.mgt.common.services.*; import org.wso2.carbon.device.application.mgt.common.services.*;
@ -306,8 +308,7 @@ public class APIUtil {
return applicationReleaseDTO; return applicationReleaseDTO;
} }
public static Application appDtoToAppResponse(ApplicationDTO applicationDTO) public static Application appDtoToAppResponse(ApplicationDTO applicationDTO) throws ApplicationManagementException {
throws BadRequestException, UnexpectedServerErrorException {
Application application = new Application(); Application application = new Application();
if (!ApplicationType.WEB_CLIP.toString().equals(applicationDTO.getType())) { if (!ApplicationType.WEB_CLIP.toString().equals(applicationDTO.getType())) {
@ -326,19 +327,18 @@ public class APIUtil {
application.setTags(applicationDTO.getTags()); application.setTags(applicationDTO.getTags());
application.setUnrestrictedRoles(applicationDTO.getUnrestrictedRoles()); application.setUnrestrictedRoles(applicationDTO.getUnrestrictedRoles());
application.setRating(applicationDTO.getAppRating()); application.setRating(applicationDTO.getAppRating());
List<ApplicationRelease> applicationReleases = applicationDTO.getApplicationReleaseDTOs() List<ApplicationRelease> applicationReleases = new ArrayList<>();
.stream().map(APIUtil::releaseDtoToRelease).collect(Collectors.toList()); for (ApplicationReleaseDTO applicationReleaseDTO : applicationDTO.getApplicationReleaseDTOs()) {
ApplicationRelease applicationRelease = releaseDtoToRelease(applicationReleaseDTO);
applicationReleases.add(applicationRelease);
}
application.setApplicationReleases(applicationReleases); application.setApplicationReleases(applicationReleases);
return application; return application;
} }
public static ApplicationRelease releaseDtoToRelease(ApplicationReleaseDTO applicationReleaseDTO){ public static ApplicationRelease releaseDtoToRelease(ApplicationReleaseDTO applicationReleaseDTO)
String host = System.getProperty(Constants.IOT_HOST_PROPERTY); throws ApplicationManagementException {
String port = System.getProperty(Constants.IOT_PORT_PROPERTY); String basePath = getArtifactDownloadBaseURL() + applicationReleaseDTO.getUuid()
String artifactDownloadEndpoint = ConfigurationManager.getInstance().getConfiguration()
.getArtifactDownloadEndpoint();
String basePath = Constants.ARTIFACT_DOWNLOAD_PROTOCOL + "://" + host + ":" + port + artifactDownloadEndpoint
+ Constants.FORWARD_SLASH + applicationReleaseDTO.getUuid()
+ Constants.FORWARD_SLASH; + Constants.FORWARD_SLASH;
List<String> screenshotPaths = new ArrayList<>(); List<String> screenshotPaths = new ArrayList<>();
@ -356,31 +356,58 @@ public class APIUtil {
applicationRelease.setIsSharedWithAllTenants(applicationReleaseDTO.getIsSharedWithAllTenants()); applicationRelease.setIsSharedWithAllTenants(applicationReleaseDTO.getIsSharedWithAllTenants());
applicationRelease.setSupportedOsVersions(applicationReleaseDTO.getSupportedOsVersions()); applicationRelease.setSupportedOsVersions(applicationReleaseDTO.getSupportedOsVersions());
applicationRelease.setRating(applicationReleaseDTO.getRating()); applicationRelease.setRating(applicationReleaseDTO.getRating());
applicationRelease.setIconPath(basePath + applicationReleaseDTO.getIconName()); applicationRelease.setIconPath(
basePath + Constants.ICON_ARTIFACT + Constants.FORWARD_SLASH + applicationReleaseDTO.getIconName());
if (!StringUtils.isEmpty(applicationReleaseDTO.getBannerName())){ if (!StringUtils.isEmpty(applicationReleaseDTO.getBannerName())){
applicationRelease.setBannerPath(basePath + applicationReleaseDTO.getBannerName()); applicationRelease.setBannerPath(
basePath + Constants.BANNER_ARTIFACT + Constants.FORWARD_SLASH + applicationReleaseDTO
.getBannerName());
} }
if (urlValidator.isValid(applicationReleaseDTO.getInstallerName())) { if (urlValidator.isValid(applicationReleaseDTO.getInstallerName())) {
applicationRelease applicationRelease.setInstallerPath(applicationReleaseDTO.getInstallerName());
.setInstallerPath(applicationReleaseDTO.getInstallerName());
} else { } else {
applicationRelease applicationRelease.setInstallerPath(
.setInstallerPath(basePath + applicationReleaseDTO.getInstallerName()); basePath + Constants.APP_ARTIFACT + Constants.FORWARD_SLASH + applicationReleaseDTO
.getInstallerName());
} }
if (!StringUtils.isEmpty(applicationReleaseDTO.getScreenshotName1())) { if (!StringUtils.isEmpty(applicationReleaseDTO.getScreenshotName1())) {
screenshotPaths.add(basePath + applicationReleaseDTO.getScreenshotName1()); screenshotPaths
.add(basePath + Constants.SCREENSHOT_ARTIFACT + 1 + Constants.FORWARD_SLASH + applicationReleaseDTO
.getScreenshotName1());
} }
if (!StringUtils.isEmpty(applicationReleaseDTO.getScreenshotName2())) { if (!StringUtils.isEmpty(applicationReleaseDTO.getScreenshotName2())) {
screenshotPaths.add(basePath + applicationReleaseDTO.getScreenshotName2()); screenshotPaths
.add(basePath + Constants.SCREENSHOT_ARTIFACT + 2 + Constants.FORWARD_SLASH + applicationReleaseDTO
.getScreenshotName2());
} }
if (!StringUtils.isEmpty(applicationReleaseDTO.getScreenshotName3())) { if (!StringUtils.isEmpty(applicationReleaseDTO.getScreenshotName3())) {
screenshotPaths.add(basePath + applicationReleaseDTO.getScreenshotName3()); screenshotPaths
.add(basePath + Constants.SCREENSHOT_ARTIFACT + 3 + Constants.FORWARD_SLASH + applicationReleaseDTO
.getScreenshotName3());
} }
applicationRelease.setScreenshots(screenshotPaths); applicationRelease.setScreenshots(screenshotPaths);
return applicationRelease; return applicationRelease;
} }
public static String getArtifactDownloadBaseURL() throws ApplicationManagementException {
String host = System.getProperty(Constants.IOT_HOST_PROPERTY);
MDMConfig mdmConfig = ConfigurationManager.getInstance().getConfiguration().getMdmConfig();
String port;
if (Constants.HTTP_PROTOCOL.equals(mdmConfig.getArtifactDownloadProtocol())){
port = System.getProperty(Constants.IOT_HTTP_PORT_PROPERTY);
} else if( Constants.HTTPS_PROTOCOL.equals(mdmConfig.getArtifactDownloadProtocol())){
port = System.getProperty(Constants.IOT_HTTPS_PORT_PROPERTY);
} else {
String msg = "In order to download application artifacts invalid protocols are defined.";
log.error(msg);
throw new ApplicationManagementException(msg);
}
String artifactDownloadEndpoint = mdmConfig.getArtifactDownloadEndpoint();
return mdmConfig.getArtifactDownloadProtocol() + "://" + host + ":" + port
+ artifactDownloadEndpoint + Constants.FORWARD_SLASH;
}
} }

@ -37,8 +37,10 @@ public class Constants {
public static final String CF_BUNDLE_VERSION = "CFBundleVersion"; public static final String CF_BUNDLE_VERSION = "CFBundleVersion";
public static final String APP_EXTENSION = ".app"; public static final String APP_EXTENSION = ".app";
public static final String IOT_HOST_PROPERTY = "iot.core.host"; public static final String IOT_HOST_PROPERTY = "iot.core.host";
public static final String IOT_PORT_PROPERTY = "iot.core.http.port"; public static final String IOT_HTTP_PORT_PROPERTY = "iot.core.http.port";
public static final String ARTIFACT_DOWNLOAD_PROTOCOL = "http"; public static final String IOT_HTTPS_PORT_PROPERTY = "iot.core.https.port";
public static final String HTTPS_PROTOCOL = "https";
public static final String HTTP_PROTOCOL = "http";
public static final String FORWARD_SLASH = "/"; public static final String FORWARD_SLASH = "/";
public static final String ANY = "ANY"; public static final String ANY = "ANY";
@ -61,16 +63,25 @@ public class Constants {
public static final String DB_TYPE_POSTGRESQL = "PostgreSQL"; public static final String DB_TYPE_POSTGRESQL = "PostgreSQL";
} }
/**
* Directory name of the icon artifact that are saved in the file system.
*/
public static final String ICON_ARTIFACT = "icon";
/**
* Directory name of the banner artifact that are saved in the file system.
*/
public static final String BANNER_ARTIFACT = "banner";
/** /**
* Name of the image artifacts that are saved in the file system. * Common directory name of the screenshot artifact that are saved in the file system.
*/ */
public static final String[] IMAGE_ARTIFACTS = {"icon", "banner", "screenshot"}; public static final String SCREENSHOT_ARTIFACT = "screenshot";
/** /**
* Directory name of the release artifacts that are saved in the file system. * Naming directory name of the application artifact that are saved in the file system.
*/ */
public static final String RELEASE_ARTIFACT = "artifact"; public static final String APP_ARTIFACT = "app";
public static final int REVIEW_PARENT_ID = -1; public static final int REVIEW_PARENT_ID = -1;

@ -23,17 +23,13 @@ import org.apache.commons.logging.LogFactory;
import org.json.JSONException; import org.json.JSONException;
import org.wso2.carbon.context.PrivilegedCarbonContext; import org.wso2.carbon.context.PrivilegedCarbonContext;
import org.wso2.carbon.device.application.mgt.common.dto.ApplicationDTO; import org.wso2.carbon.device.application.mgt.common.dto.ApplicationDTO;
import org.wso2.carbon.device.application.mgt.common.PaginationRequest;
import org.wso2.carbon.device.application.mgt.common.dto.ApplicationReleaseDTO; import org.wso2.carbon.device.application.mgt.common.dto.ApplicationReleaseDTO;
import org.wso2.carbon.device.application.mgt.common.dto.DeviceSubscriptionDTO; import org.wso2.carbon.device.application.mgt.common.dto.DeviceSubscriptionDTO;
import org.wso2.carbon.device.application.mgt.common.dto.ReviewDTO; import org.wso2.carbon.device.application.mgt.common.dto.ReviewDTO;
import org.wso2.carbon.device.application.mgt.common.exception.ReviewManagementException;
import org.wso2.carbon.device.application.mgt.common.services.ApplicationManager; import org.wso2.carbon.device.application.mgt.common.services.ApplicationManager;
import org.wso2.carbon.device.application.mgt.common.services.ApplicationStorageManager; import org.wso2.carbon.device.application.mgt.common.services.ApplicationStorageManager;
import org.wso2.carbon.device.application.mgt.common.services.SubscriptionManager; import org.wso2.carbon.device.application.mgt.common.services.SubscriptionManager;
import org.wso2.carbon.device.application.mgt.core.config.Configuration;
import org.wso2.carbon.device.application.mgt.core.config.ConfigurationManager;
import org.wso2.carbon.device.application.mgt.core.exception.UnexpectedServerErrorException; import org.wso2.carbon.device.application.mgt.core.exception.UnexpectedServerErrorException;
import org.wso2.carbon.device.mgt.core.service.DeviceManagementProviderService; import org.wso2.carbon.device.mgt.core.service.DeviceManagementProviderService;
import org.wso2.carbon.device.mgt.core.service.DeviceManagementProviderServiceImpl; import org.wso2.carbon.device.mgt.core.service.DeviceManagementProviderServiceImpl;
@ -264,21 +260,6 @@ public class DAOUtil {
} }
} }
public static PaginationRequest validateCommentListPageSize(PaginationRequest paginationRequest) throws
ReviewManagementException {
if (paginationRequest.getLimit() == 0) {
Configuration commentManagementConfig = ConfigurationManager.getInstance().getConfiguration();
if (commentManagementConfig != null) {
paginationRequest.setLimit(
commentManagementConfig.getPaginationConfiguration().getCommentListPageSize());
} else {
throw new ReviewManagementException(
"ApplicationDTO Management configuration has not initialized. Please check the application-mgt.xml file.");
}
}
return paginationRequest;
}
private static ApplicationManager applicationManager; private static ApplicationManager applicationManager;
private static ApplicationStorageManager applicationStorageManager; private static ApplicationStorageManager applicationStorageManager;
private static SubscriptionManager subscriptionManager; private static SubscriptionManager subscriptionManager;

@ -6,6 +6,7 @@ import org.apache.commons.logging.LogFactory;
import org.testng.annotations.BeforeClass; import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test; import org.testng.annotations.Test;
import org.wso2.carbon.device.application.mgt.core.BaseTestCase; import org.wso2.carbon.device.application.mgt.core.BaseTestCase;
import org.wso2.carbon.device.application.mgt.core.config.ConfigurationManager;
import org.wso2.carbon.device.application.mgt.core.dao.common.ApplicationManagementDAOFactory; import org.wso2.carbon.device.application.mgt.core.dao.common.ApplicationManagementDAOFactory;
import org.wso2.carbon.device.application.mgt.core.dto.ApplicationsDTO; import org.wso2.carbon.device.application.mgt.core.dto.ApplicationsDTO;
import org.wso2.carbon.device.application.mgt.core.dto.DeviceTypeCreator; import org.wso2.carbon.device.application.mgt.core.dto.DeviceTypeCreator;
@ -22,12 +23,12 @@ public class ApplicationManagementDAOTest extends BaseTestCase {
@BeforeClass @BeforeClass
public void initialize() throws Exception { public void initialize() throws Exception {
log.info("Initializing ApplicationManagementDAOTest tests"); log.info("Initializing ApplicationManagementDAOTest tests");
ConfigurationManager configurationManager = ConfigurationManager.getInstance();
// super.initializeServices(); // super.initializeServices();
} }
@Test @Test
public void testAddApplication() throws Exception { public void testAddApplication() throws Exception {
ApplicationDAO applicationDAO = ApplicationManagementDAOFactory.getApplicationDAO(); ApplicationDAO applicationDAO = ApplicationManagementDAOFactory.getApplicationDAO();
ConnectionManagerUtil.beginDBTransaction(); ConnectionManagerUtil.beginDBTransaction();
applicationDAO.createApplication(ApplicationsDTO.getApp1(), -1234); applicationDAO.createApplication(ApplicationsDTO.getApp1(), -1234);
@ -52,6 +53,4 @@ public class ApplicationManagementDAOTest extends BaseTestCase {
DeviceManagementDAOFactory.closeConnection(); DeviceManagementDAOFactory.closeConnection();
} }
} }
} }

@ -18,7 +18,7 @@
--> -->
<ApplicationManagementConfiguration> <ApplicationManagementConfiguration>
<!-- ApplicationDTO Mgt DB schema --> <!-- Application Mgt DB schema -->
<DatasourceName>jdbc/APPM_DS</DatasourceName> <DatasourceName>jdbc/APPM_DS</DatasourceName>
<Extensions> <Extensions>
@ -135,7 +135,6 @@
<UIConfigs> <UIConfigs>
<EnableOAuth>true</EnableOAuth> <EnableOAuth>true</EnableOAuth>
<EnableSSO>false</EnableSSO> <EnableSSO>false</EnableSSO>
<EnableSSO>false</EnableSSO>
<AppRegistration> <AppRegistration>
<Tags> <Tags>
<Tag>application_management</Tag> <Tag>application_management</Tag>
@ -150,13 +149,18 @@
<Scope>perm:app:review:update</Scope> <Scope>perm:app:review:update</Scope>
<Scope>perm:app:publisher:view</Scope> <Scope>perm:app:publisher:view</Scope>
<Scope>perm:app:publisher:update</Scope> <Scope>perm:app:publisher:update</Scope>
<Scope>perm:app:store:view</Scope>
<Scope>perm:app:subscription:install</Scope>
<Scope>perm:app:subscription:uninstall</Scope>
<Scope>perm:admin:app:review:update</Scope>
<Scope>perm:admin:app:review:view</Scope>
<Scope>perm:admin:app:publisher:update</Scope>
<Scope>perm:admin:app:review:update</Scope>
</Scopes> </Scopes>
<SSOConfiguration> <SSOConfiguration>
<Issuer>app-mgt</Issuer> <Issuer>app-mgt</Issuer>
</SSOConfiguration> </SSOConfiguration>
<LoginResponse> <ErrorCallback>
<SuccessCallback>/application-mgt</SuccessCallback>
<FailureCallback>
<BadRequest>/pages/error/client-errors/400</BadRequest> <BadRequest>/pages/error/client-errors/400</BadRequest>
<Unauthorized>/pages/error/client-errors/401</Unauthorized> <Unauthorized>/pages/error/client-errors/401</Unauthorized>
<Forbidden>/pages/error/client-errors/403</Forbidden> <Forbidden>/pages/error/client-errors/403</Forbidden>
@ -166,7 +170,21 @@
<UnsupportedMediaType>/pages/error/client-errors/415</UnsupportedMediaType> <UnsupportedMediaType>/pages/error/client-errors/415</UnsupportedMediaType>
<InternalServerError>/pages/error/server-errors/500</InternalServerError> <InternalServerError>/pages/error/server-errors/500</InternalServerError>
<DefaultPage>/pages/error/default</DefaultPage> <DefaultPage>/pages/error/default</DefaultPage>
</FailureCallback> </ErrorCallback>
</LoginResponse>
</UIConfigs> </UIConfigs>
<AppCategories>
<Category>EMM</Category>
<Category>IoT</Category>
</AppCategories>
<RatingConfig>
<MinRatingValue>1</MinRatingValue>
<MaxRatingValue>10</MaxRatingValue>
</RatingConfig>
<MDMConfig>
<ArtifactDownloadProtocol>https</ArtifactDownloadProtocol>
<ArtifactDownloadEndpoint>/api/application-mgt/v1.0/artifact</ArtifactDownloadEndpoint>
</MDMConfig>
</ApplicationManagementConfiguration> </ApplicationManagementConfiguration>

@ -37,7 +37,7 @@
<Extension name="ApplicationStorageManager"> <Extension name="ApplicationStorageManager">
<ClassName>org.wso2.carbon.device.application.mgt.core.impl.ApplicationStorageManagerImpl</ClassName> <ClassName>org.wso2.carbon.device.application.mgt.core.impl.ApplicationStorageManagerImpl</ClassName>
<Parameters> <Parameters>
<Parameter name="StoragePath">/tmp/apps/</Parameter> <Parameter name="StoragePath">repository/resources/apps/</Parameter>
<Parameter name="MaxScreenShotCount">6</Parameter> <Parameter name="MaxScreenShotCount">6</Parameter>
</Parameters> </Parameters>
</Extension> </Extension>
@ -135,7 +135,6 @@
<UIConfigs> <UIConfigs>
<EnableOAuth>true</EnableOAuth> <EnableOAuth>true</EnableOAuth>
<EnableSSO>false</EnableSSO> <EnableSSO>false</EnableSSO>
<EnableSSO>false</EnableSSO>
<AppRegistration> <AppRegistration>
<Tags> <Tags>
<Tag>application_management</Tag> <Tag>application_management</Tag>
@ -151,13 +150,17 @@
<Scope>perm:app:publisher:view</Scope> <Scope>perm:app:publisher:view</Scope>
<Scope>perm:app:publisher:update</Scope> <Scope>perm:app:publisher:update</Scope>
<Scope>perm:app:store:view</Scope> <Scope>perm:app:store:view</Scope>
<Scope>perm:app:subscription:install</Scope>
<Scope>perm:app:subscription:uninstall</Scope>
<Scope>perm:admin:app:review:update</Scope>
<Scope>perm:admin:app:review:view</Scope>
<Scope>perm:admin:app:publisher:update</Scope>
<Scope>perm:admin:app:review:update</Scope>
</Scopes> </Scopes>
<SSOConfiguration> <SSOConfiguration>
<Issuer>app-mgt</Issuer> <Issuer>app-mgt</Issuer>
</SSOConfiguration> </SSOConfiguration>
<LoginResponse> <ErrorCallback>
<SuccessCallback>/apps</SuccessCallback>
<FailureCallback>
<BadRequest>/pages/error/client-errors/400</BadRequest> <BadRequest>/pages/error/client-errors/400</BadRequest>
<Unauthorized>/pages/error/client-errors/401</Unauthorized> <Unauthorized>/pages/error/client-errors/401</Unauthorized>
<Forbidden>/pages/error/client-errors/403</Forbidden> <Forbidden>/pages/error/client-errors/403</Forbidden>
@ -167,11 +170,9 @@
<UnsupportedMediaType>/pages/error/client-errors/415</UnsupportedMediaType> <UnsupportedMediaType>/pages/error/client-errors/415</UnsupportedMediaType>
<InternalServerError>/pages/error/server-errors/500</InternalServerError> <InternalServerError>/pages/error/server-errors/500</InternalServerError>
<DefaultPage>/pages/error/default</DefaultPage> <DefaultPage>/pages/error/default</DefaultPage>
</FailureCallback> </ErrorCallback>
</LoginResponse>
</UIConfigs> </UIConfigs>
<ArtifactDownloadEndpoint>https://localhost:9443/api/application-mgt/v1.0/artifact</ArtifactDownloadEndpoint>
<AppCategories> <AppCategories>
<Category>EMM</Category> <Category>EMM</Category>
<Category>IoT</Category> <Category>IoT</Category>
@ -181,4 +182,9 @@
<MinRatingValue>1</MinRatingValue> <MinRatingValue>1</MinRatingValue>
<MaxRatingValue>10</MaxRatingValue> <MaxRatingValue>10</MaxRatingValue>
</RatingConfig> </RatingConfig>
<MDMConfig>
<ArtifactDownloadProtocol>https</ArtifactDownloadProtocol>
<ArtifactDownloadEndpoint>/api/application-mgt/v1.0/artifact</ArtifactDownloadEndpoint>
</MDMConfig>
</ApplicationManagementConfiguration> </ApplicationManagementConfiguration>

@ -22,13 +22,13 @@
<parent> <parent>
<artifactId>application-mgt</artifactId> <artifactId>application-mgt</artifactId>
<groupId>org.wso2.carbon.devicemgt</groupId> <groupId>org.wso2.carbon.devicemgt</groupId>
<version>3.2.7-SNAPSHOT</version> <version>3.2.9-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath> <relativePath>../pom.xml</relativePath>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<artifactId>org.wso2.carbon.device.application.mgt.publisher.api</artifactId> <artifactId>org.wso2.carbon.device.application.mgt.publisher.api</artifactId>
<version>3.2.7-SNAPSHOT</version> <version>3.2.9-SNAPSHOT</version>
<packaging>war</packaging> <packaging>war</packaging>
<name>WSO2 Carbon - Application Management Publisher API</name> <name>WSO2 Carbon - Application Management Publisher API</name>
<description>WSO2 Carbon - Application Management Publisher API</description> <description>WSO2 Carbon - Application Management Publisher API</description>

@ -24,10 +24,10 @@
<parent> <parent>
<groupId>org.wso2.carbon.devicemgt</groupId> <groupId>org.wso2.carbon.devicemgt</groupId>
<artifactId>application-mgt</artifactId> <artifactId>application-mgt</artifactId>
<version>3.2.7-SNAPSHOT</version> <version>3.2.9-SNAPSHOT</version>
</parent> </parent>
<artifactId>org.wso2.carbon.device.application.mgt.publisher.ui</artifactId> <artifactId>org.wso2.carbon.device.application.mgt.publisher.ui</artifactId>
<version>3.2.7-SNAPSHOT</version> <version>3.2.9-SNAPSHOT</version>
<packaging>war</packaging> <packaging>war</packaging>
<name>WSO2 Carbon - Application Management Publisher UI Component</name> <name>WSO2 Carbon - Application Management Publisher UI Component</name>
<url>http://wso2.org</url> <url>http://wso2.org</url>

@ -22,13 +22,13 @@
<parent> <parent>
<artifactId>application-mgt</artifactId> <artifactId>application-mgt</artifactId>
<groupId>org.wso2.carbon.devicemgt</groupId> <groupId>org.wso2.carbon.devicemgt</groupId>
<version>3.2.7-SNAPSHOT</version> <version>3.2.9-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath> <relativePath>../pom.xml</relativePath>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<artifactId>org.wso2.carbon.device.application.mgt.store.api</artifactId> <artifactId>org.wso2.carbon.device.application.mgt.store.api</artifactId>
<version>3.2.7-SNAPSHOT</version> <version>3.2.9-SNAPSHOT</version>
<packaging>war</packaging> <packaging>war</packaging>
<name>WSO2 Carbon - Application Management Store API</name> <name>WSO2 Carbon - Application Management Store API</name>
<description>WSO2 Carbon - Application Management Store API</description> <description>WSO2 Carbon - Application Management Store API</description>

@ -82,7 +82,7 @@ public interface SubscriptionManagementAPI {
String SCOPE = "scope"; String SCOPE = "scope";
@POST @POST
@Path("/install/{uuid}/devices/{action}") @Path("/{uuid}/devices/{action}")
@Produces(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON) @Consumes(MediaType.APPLICATION_JSON)
@ApiOperation( @ApiOperation(
@ -124,7 +124,7 @@ public interface SubscriptionManagementAPI {
); );
@POST @POST
@Path("/install/{uuid}/{subType}/{action}") @Path("/{uuid}/{subType}/{action}")
@Produces(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON) @Consumes(MediaType.APPLICATION_JSON)
@ApiOperation( @ApiOperation(

@ -49,7 +49,7 @@ public class SubscriptionManagementAPIImpl implements SubscriptionManagementAPI{
@Override @Override
@POST @POST
@Path("/install/{uuid}/devices/{action}") @Path("/{uuid}/devices/{action}")
public Response performAppOperationForDevices( public Response performAppOperationForDevices(
@PathParam("uuid") String uuid, @PathParam("uuid") String uuid,
@PathParam("action") String action, @PathParam("action") String action,
@ -83,7 +83,7 @@ public class SubscriptionManagementAPIImpl implements SubscriptionManagementAPI{
@Override @Override
@POST @POST
@Path("/install/{uuid}/{subType}/{action}") @Path("/{uuid}/{subType}/{action}")
public Response performBulkAppOperation( public Response performBulkAppOperation(
@PathParam("uuid") String uuid, @PathParam("uuid") String uuid,
@PathParam("subType") String subType, @PathParam("subType") String subType,

@ -24,10 +24,10 @@
<parent> <parent>
<groupId>org.wso2.carbon.devicemgt</groupId> <groupId>org.wso2.carbon.devicemgt</groupId>
<artifactId>application-mgt</artifactId> <artifactId>application-mgt</artifactId>
<version>3.2.7-SNAPSHOT</version> <version>3.2.9-SNAPSHOT</version>
</parent> </parent>
<artifactId>org.wso2.carbon.device.application.mgt.store.ui</artifactId> <artifactId>org.wso2.carbon.device.application.mgt.store.ui</artifactId>
<version>3.2.7-SNAPSHOT</version> <version>3.2.9-SNAPSHOT</version>
<packaging>war</packaging> <packaging>war</packaging>
<name>WSO2 Carbon - Application Management Store UI Component</name> <name>WSO2 Carbon - Application Management Store UI Component</name>
<url>http://wso2.org</url> <url>http://wso2.org</url>

@ -1,5 +1,5 @@
import React from "react"; import React from "react";
import {Button, Modal, Tabs} from "antd"; import {Modal, Tabs} from "antd";
import UserInstall from "./UserInstall"; import UserInstall from "./UserInstall";
import GroupInstall from "./GroupInstall"; import GroupInstall from "./GroupInstall";
import RoleInstall from "./RoleInstall"; import RoleInstall from "./RoleInstall";

@ -131,7 +131,8 @@ class DeviceInstall extends React.Component {
//send request to the invoker //send request to the invoker
axios.get( axios.get(
window.location.origin+ config.serverConfig.invoker.uri + config.serverConfig.invoker.deviceMgt+"/devices?" + encodedExtraParams, window.location.origin+
+ config.serverConfig.invoker.uri + config.serverConfig.invoker.deviceMgt+"/devices?" + encodedExtraParams,
).then(res => { ).then(res => {
if (res.status === 200) { if (res.status === 200) {
@ -186,15 +187,17 @@ class DeviceInstall extends React.Component {
type: device.type type: device.type
}); });
}); });
this.props.onInstall("device", payload); this.props.onInstall("devices", payload);
}; };
render() { render() {
const {data,pagination,loading,selectedRows} = this.state; const {data,pagination,loading,selectedRows} = this.state;
return ( return (
<div> <div>
<Text>Start installing the application for one or more users by entering the corresponding user name. Select install to automatically start downloading the application for the respective user/users. </Text> <Text>
Start installing the application for one or more users by entering the corresponding user name.
Select install to automatically start downloading the application for the respective user/users.
</Text>
<Table <Table
style={{paddingTop:20}} style={{paddingTop:20}}
columns={columns} columns={columns}
@ -213,7 +216,9 @@ class DeviceInstall extends React.Component {
scroll={{x: 1000}} scroll={{x: 1000}}
/> />
<div style={{paddingTop: 10, textAlign: "right"}}> <div style={{paddingTop: 10, textAlign: "right"}}>
<Button disabled={selectedRows.length===0} htmlType="button" type="primary" onClick={this.install}>Install</Button> <Button disabled={selectedRows.length===0} htmlType="button" type="primary" onClick={this.install}>
Install
</Button>
</div> </div>
</div> </div>
); );

@ -22,13 +22,13 @@
<parent> <parent>
<groupId>org.wso2.carbon.devicemgt</groupId> <groupId>org.wso2.carbon.devicemgt</groupId>
<artifactId>carbon-devicemgt</artifactId> <artifactId>carbon-devicemgt</artifactId>
<version>3.2.7-SNAPSHOT</version> <version>3.2.9-SNAPSHOT</version>
<relativePath>../../pom.xml</relativePath> <relativePath>../../pom.xml</relativePath>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<artifactId>application-mgt</artifactId> <artifactId>application-mgt</artifactId>
<version>3.2.7-SNAPSHOT</version> <version>3.2.9-SNAPSHOT</version>
<packaging>pom</packaging> <packaging>pom</packaging>
<name>WSO2 Carbon - Application Management Component</name> <name>WSO2 Carbon - Application Management Component</name>
<description>WSO2 Carbon - Application Management Component</description> <description>WSO2 Carbon - Application Management Component</description>

@ -22,7 +22,7 @@
<parent> <parent>
<artifactId>certificate-mgt</artifactId> <artifactId>certificate-mgt</artifactId>
<groupId>org.wso2.carbon.devicemgt</groupId> <groupId>org.wso2.carbon.devicemgt</groupId>
<version>3.2.7-SNAPSHOT</version> <version>3.2.9-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath> <relativePath>../pom.xml</relativePath>
</parent> </parent>

@ -22,7 +22,7 @@
<parent> <parent>
<artifactId>certificate-mgt</artifactId> <artifactId>certificate-mgt</artifactId>
<groupId>org.wso2.carbon.devicemgt</groupId> <groupId>org.wso2.carbon.devicemgt</groupId>
<version>3.2.7-SNAPSHOT</version> <version>3.2.9-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath> <relativePath>../pom.xml</relativePath>
</parent> </parent>

@ -21,13 +21,13 @@
<parent> <parent>
<groupId>org.wso2.carbon.devicemgt</groupId> <groupId>org.wso2.carbon.devicemgt</groupId>
<artifactId>certificate-mgt</artifactId> <artifactId>certificate-mgt</artifactId>
<version>3.2.7-SNAPSHOT</version> <version>3.2.9-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath> <relativePath>../pom.xml</relativePath>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<artifactId>org.wso2.carbon.certificate.mgt.core</artifactId> <artifactId>org.wso2.carbon.certificate.mgt.core</artifactId>
<version>3.2.7-SNAPSHOT</version> <version>3.2.9-SNAPSHOT</version>
<packaging>bundle</packaging> <packaging>bundle</packaging>
<name>WSO2 Carbon - Certificate Management Core</name> <name>WSO2 Carbon - Certificate Management Core</name>
<description>WSO2 Carbon - Certificate Management Core</description> <description>WSO2 Carbon - Certificate Management Core</description>

@ -22,14 +22,14 @@
<parent> <parent>
<groupId>org.wso2.carbon.devicemgt</groupId> <groupId>org.wso2.carbon.devicemgt</groupId>
<artifactId>carbon-devicemgt</artifactId> <artifactId>carbon-devicemgt</artifactId>
<version>3.2.7-SNAPSHOT</version> <version>3.2.9-SNAPSHOT</version>
<relativePath>../../pom.xml</relativePath> <relativePath>../../pom.xml</relativePath>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<groupId>org.wso2.carbon.devicemgt</groupId> <groupId>org.wso2.carbon.devicemgt</groupId>
<artifactId>certificate-mgt</artifactId> <artifactId>certificate-mgt</artifactId>
<version>3.2.7-SNAPSHOT</version> <version>3.2.9-SNAPSHOT</version>
<packaging>pom</packaging> <packaging>pom</packaging>
<name>WSO2 Carbon - Certificate Management Component</name> <name>WSO2 Carbon - Certificate Management Component</name>
<url>http://wso2.org</url> <url>http://wso2.org</url>

@ -22,7 +22,7 @@
<parent> <parent>
<artifactId>device-mgt-extensions</artifactId> <artifactId>device-mgt-extensions</artifactId>
<groupId>org.wso2.carbon.devicemgt</groupId> <groupId>org.wso2.carbon.devicemgt</groupId>
<version>3.2.7-SNAPSHOT</version> <version>3.2.9-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath> <relativePath>../pom.xml</relativePath>
</parent> </parent>

@ -22,7 +22,7 @@
<parent> <parent>
<artifactId>device-mgt-extensions</artifactId> <artifactId>device-mgt-extensions</artifactId>
<groupId>org.wso2.carbon.devicemgt</groupId> <groupId>org.wso2.carbon.devicemgt</groupId>
<version>3.2.7-SNAPSHOT</version> <version>3.2.9-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath> <relativePath>../pom.xml</relativePath>
</parent> </parent>

@ -22,7 +22,7 @@
<parent> <parent>
<artifactId>device-mgt-extensions</artifactId> <artifactId>device-mgt-extensions</artifactId>
<groupId>org.wso2.carbon.devicemgt</groupId> <groupId>org.wso2.carbon.devicemgt</groupId>
<version>3.2.7-SNAPSHOT</version> <version>3.2.9-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath> <relativePath>../pom.xml</relativePath>
</parent> </parent>

@ -22,7 +22,7 @@
<parent> <parent>
<artifactId>device-mgt-extensions</artifactId> <artifactId>device-mgt-extensions</artifactId>
<groupId>org.wso2.carbon.devicemgt</groupId> <groupId>org.wso2.carbon.devicemgt</groupId>
<version>3.2.7-SNAPSHOT</version> <version>3.2.9-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath> <relativePath>../pom.xml</relativePath>
</parent> </parent>

@ -22,7 +22,7 @@
<parent> <parent>
<artifactId>device-mgt-extensions</artifactId> <artifactId>device-mgt-extensions</artifactId>
<groupId>org.wso2.carbon.devicemgt</groupId> <groupId>org.wso2.carbon.devicemgt</groupId>
<version>3.2.7-SNAPSHOT</version> <version>3.2.9-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath> <relativePath>../pom.xml</relativePath>
</parent> </parent>

@ -22,7 +22,7 @@
<parent> <parent>
<artifactId>device-mgt-extensions</artifactId> <artifactId>device-mgt-extensions</artifactId>
<groupId>org.wso2.carbon.devicemgt</groupId> <groupId>org.wso2.carbon.devicemgt</groupId>
<version>3.2.7-SNAPSHOT</version> <version>3.2.9-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath> <relativePath>../pom.xml</relativePath>
</parent> </parent>

@ -22,7 +22,7 @@
<parent> <parent>
<artifactId>carbon-devicemgt</artifactId> <artifactId>carbon-devicemgt</artifactId>
<groupId>org.wso2.carbon.devicemgt</groupId> <groupId>org.wso2.carbon.devicemgt</groupId>
<version>3.2.7-SNAPSHOT</version> <version>3.2.9-SNAPSHOT</version>
<relativePath>../../pom.xml</relativePath> <relativePath>../../pom.xml</relativePath>
</parent> </parent>

@ -22,7 +22,7 @@
<parent> <parent>
<groupId>org.wso2.carbon.devicemgt</groupId> <groupId>org.wso2.carbon.devicemgt</groupId>
<artifactId>device-mgt</artifactId> <artifactId>device-mgt</artifactId>
<version>3.2.7-SNAPSHOT</version> <version>3.2.9-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath> <relativePath>../pom.xml</relativePath>
</parent> </parent>

@ -20,7 +20,7 @@
<parent> <parent>
<artifactId>device-mgt</artifactId> <artifactId>device-mgt</artifactId>
<groupId>org.wso2.carbon.devicemgt</groupId> <groupId>org.wso2.carbon.devicemgt</groupId>
<version>3.2.7-SNAPSHOT</version> <version>3.2.9-SNAPSHOT</version>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>

@ -22,7 +22,7 @@
<parent> <parent>
<artifactId>device-mgt</artifactId> <artifactId>device-mgt</artifactId>
<groupId>org.wso2.carbon.devicemgt</groupId> <groupId>org.wso2.carbon.devicemgt</groupId>
<version>3.2.7-SNAPSHOT</version> <version>3.2.9-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath> <relativePath>../pom.xml</relativePath>
</parent> </parent>

@ -58,6 +58,7 @@ import org.wso2.carbon.device.mgt.common.operation.mgt.Activity;
import org.wso2.carbon.device.mgt.common.operation.mgt.Operation; import org.wso2.carbon.device.mgt.common.operation.mgt.Operation;
import org.wso2.carbon.device.mgt.common.policy.mgt.Policy; import org.wso2.carbon.device.mgt.common.policy.mgt.Policy;
import org.wso2.carbon.device.mgt.common.policy.mgt.monitor.NonComplianceData; import org.wso2.carbon.device.mgt.common.policy.mgt.monitor.NonComplianceData;
import org.wso2.carbon.device.mgt.common.search.PropertyMap;
import org.wso2.carbon.device.mgt.common.search.SearchContext; import org.wso2.carbon.device.mgt.common.search.SearchContext;
import org.wso2.carbon.device.mgt.jaxrs.beans.DeviceList; import org.wso2.carbon.device.mgt.jaxrs.beans.DeviceList;
import org.wso2.carbon.device.mgt.jaxrs.beans.ErrorResponse; import org.wso2.carbon.device.mgt.jaxrs.beans.ErrorResponse;
@ -79,6 +80,7 @@ import javax.ws.rs.QueryParam;
import javax.ws.rs.core.MediaType; import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response; import javax.ws.rs.core.Response;
import java.util.List; import java.util.List;
import java.util.Map;
/** /**
* Device related REST-API. This can be used to manipulated device related details. * Device related REST-API. This can be used to manipulated device related details.
@ -1074,6 +1076,84 @@ public interface DeviceManagementService {
required = true) required = true)
SearchContext searchContext); SearchContext searchContext);
@POST
@Path("/query-devices")
@ApiOperation(
produces = MediaType.APPLICATION_JSON,
consumes = MediaType.APPLICATION_JSON,
httpMethod = "POST",
value = "Property based Search for Devices",
notes = "Search for devices based on properties",
tags = "Device Management",
extensions = {
@Extension(properties = {
@ExtensionProperty(name = Constants.SCOPE, value = "perm:devices:search")
})
}
)
@ApiResponses(
value = {
@ApiResponse(
code = 200,
message = "OK. \n Successfully retrieved the device information.",
response = DeviceList.class,
responseHeaders = {
@ResponseHeader(
name = "Content-Type",
description = "The content type of the body"),
@ResponseHeader(
name = "ETag",
description = "Entity Tag of the response resource.\n" +
"Used by caches, or in conditional requests."),
@ResponseHeader(
name = "Last-Modified",
description = "Date and time the resource was last modified. \n" +
"Used by caches, or in conditional requests.")}),
@ApiResponse(
code = 304,
message = "Not Modified. \n " +
"Empty body because the client already has the latest version of the requested resource.\n"),
@ApiResponse(
code = 400,
message = "Bad Request. \n Invalid request or validation error.",
response = ErrorResponse.class),
@ApiResponse(
code = 404,
message = "Not Acceptable.\n The existing device did not match the values specified in the device search.",
response = ErrorResponse.class),
@ApiResponse(
code = 406,
message = "Not Acceptable.\n The requested media type is not supported"),
@ApiResponse(
code = 415,
message = "Unsupported media type. \n The format of the requested entity was not supported."),
@ApiResponse(
code = 500,
message = "Internal Server Error. \n " +
"Server error occurred while getting the device details.",
response = ErrorResponse.class)
})
Response queryDevicesByProperties(
@ApiParam(
name = "offset",
value = "The starting pagination index for the complete list of qualified items.",
required = false,
defaultValue = "0")
@QueryParam("offset")
int offset,
@ApiParam(
name = "limit",
value = "Provide how many activity details you require from the starting pagination index/offset.",
required = false,
defaultValue = "5")
@QueryParam("limit")
int limit,
@ApiParam(
name = "device property map",
value = "properties by which devices need filtered",
required = true)
PropertyMap map);
@GET @GET
@Path("/{type}/{id}/applications") @Path("/{type}/{id}/applications")
@ApiOperation( @ApiOperation(

@ -63,6 +63,7 @@ import org.wso2.carbon.device.mgt.common.operation.mgt.OperationManagementExcept
import org.wso2.carbon.device.mgt.common.policy.mgt.Policy; import org.wso2.carbon.device.mgt.common.policy.mgt.Policy;
import org.wso2.carbon.device.mgt.common.policy.mgt.monitor.NonComplianceData; import org.wso2.carbon.device.mgt.common.policy.mgt.monitor.NonComplianceData;
import org.wso2.carbon.device.mgt.common.policy.mgt.monitor.PolicyComplianceException; import org.wso2.carbon.device.mgt.common.policy.mgt.monitor.PolicyComplianceException;
import org.wso2.carbon.device.mgt.common.search.PropertyMap;
import org.wso2.carbon.device.mgt.common.search.SearchContext; import org.wso2.carbon.device.mgt.common.search.SearchContext;
import org.wso2.carbon.device.mgt.core.app.mgt.ApplicationManagementProviderService; import org.wso2.carbon.device.mgt.core.app.mgt.ApplicationManagementProviderService;
import org.wso2.carbon.device.mgt.core.device.details.mgt.DeviceDetailsMgtException; import org.wso2.carbon.device.mgt.core.device.details.mgt.DeviceDetailsMgtException;
@ -104,6 +105,7 @@ import java.text.SimpleDateFormat;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
import java.util.Map;
@Path("/devices") @Path("/devices")
@Produces(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON)
@ -652,6 +654,30 @@ public class DeviceManagementServiceImpl implements DeviceManagementService {
return Response.status(Response.Status.OK).entity(deviceList).build(); return Response.status(Response.Status.OK).entity(deviceList).build();
} }
@POST
@Path("/query-devices")
@Override
public Response queryDevicesByProperties(@QueryParam("offset") int offset,
@QueryParam("limit") int limit, PropertyMap map) {
List<Device> devices;
DeviceList deviceList = new DeviceList();
try {
DeviceManagementProviderService dms = DeviceMgtAPIUtils.getDeviceManagementService();
devices = dms.getDevicesBasedOnProperties(map.getProperties());
if(devices == null || devices.isEmpty()){
return Response.status(Response.Status.OK).entity("No device found matching query criteria.").build();
}
} catch (DeviceManagementException e) {
String msg = "Error occurred while searching for devices that matches the provided device properties";
log.error(msg, e);
return Response.serverError().entity(
new ErrorResponse.ErrorResponseBuilder().setMessage(msg).build()).build();
}
deviceList.setList(devices);
deviceList.setCount(devices.size());
return Response.status(Response.Status.OK).entity(deviceList).build();
}
@GET @GET
@Path("/{type}/{id}/applications") @Path("/{type}/{id}/applications")
@Override @Override

@ -21,7 +21,7 @@
<parent> <parent>
<artifactId>device-mgt</artifactId> <artifactId>device-mgt</artifactId>
<groupId>org.wso2.carbon.devicemgt</groupId> <groupId>org.wso2.carbon.devicemgt</groupId>
<version>3.2.7-SNAPSHOT</version> <version>3.2.9-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath> <relativePath>../pom.xml</relativePath>
</parent> </parent>

@ -14,6 +14,23 @@
* KIND, either express or implied. See the License for the * KIND, either express or implied. See the License for the
* specific language governing permissions and limitations * specific language governing permissions and limitations
* under the License. * under the License.
*
*
* Copyright (c) 2019, Entgra (Pvt) Ltd. (http://entgra.io) All Rights Reserved.
*
* Entgra (Pvt) Ltd. licenses this file to you under the Apache License,
* Version 2.0 (the "License"); you may not use this file except
* in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/ */
package org.wso2.carbon.device.mgt.common; package org.wso2.carbon.device.mgt.common;
@ -80,6 +97,15 @@ public interface DeviceManager {
*/ */
boolean disenrollDevice(DeviceIdentifier deviceId) throws DeviceManagementException; boolean disenrollDevice(DeviceIdentifier deviceId) throws DeviceManagementException;
/**
* Method to delete a particular device from CDM.
*
* @param deviceId Fully qualified device identifier
* @return A boolean indicating the status of the operation.
* @throws DeviceManagementException If some unusual behaviour is observed while deleting a device
*/
boolean deleteDevice(DeviceIdentifier deviceId, Device device) throws DeviceManagementException;
/** /**
* Method to retrieve the status of the registration process of a particular device. * Method to retrieve the status of the registration process of a particular device.
* *

@ -0,0 +1,43 @@
/*
* Copyright (c) 2016, 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.common.search;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.util.Map;
@ApiModel(value = "PropertyMap", description = "Search properties based on which devices need to be found.")
public class PropertyMap {
@ApiModelProperty(name = "properties", value = "Contains the properties for search.",
required = true)
private Map<String, String> properties;
public Map<String, String> getProperties() {
return properties;
}
public void setProperties(Map<String, String> properties) {
this.properties = properties;
}
}

@ -22,7 +22,7 @@
<parent> <parent>
<groupId>org.wso2.carbon.devicemgt</groupId> <groupId>org.wso2.carbon.devicemgt</groupId>
<artifactId>device-mgt</artifactId> <artifactId>device-mgt</artifactId>
<version>3.2.7-SNAPSHOT</version> <version>3.2.9-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath> <relativePath>../pom.xml</relativePath>
</parent> </parent>

@ -47,6 +47,7 @@ import org.wso2.carbon.device.mgt.core.geo.geoHash.GeoCoordinate;
import java.util.Date; import java.util.Date;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map;
/** /**
* This class represents the key operations associated with persisting device related information. * This class represents the key operations associated with persisting device related information.
@ -180,6 +181,26 @@ public interface DeviceDAO {
Device getDevice(DeviceIdentifier deviceIdentifier, Date ifModifiedSince, int tenantId) throws Device getDevice(DeviceIdentifier deviceIdentifier, Date ifModifiedSince, int tenantId) throws
DeviceManagementDAOException; DeviceManagementDAOException;
/**
* Retrieves a list of devices based on a given criteria of properties
* @param deviceProps properties by which devices need to be filtered
* @param tenantId tenant id
* @return list of devices with properties
* @throws DeviceManagementDAOException
*/
List<Device> getDeviceBasedOnDeviceProperties(Map<String, String> deviceProps, int tenantId) throws DeviceManagementDAOException;
/**
* Retrieves properties of given device identifier
*
* @param deviceId identifier of device that need to be retrieved
* @param tenantId tenant ID
* @return list of devices with properties
* @throws DeviceManagementDAOException
*/
Device getDeviceProps(String deviceId, int tenantId) throws DeviceManagementDAOException;
/** /**
* This method is used to retrieve a device of a given device-identifier and tenant-id which modified * This method is used to retrieve a device of a given device-identifier and tenant-id which modified
* later than the ifModifiedSince param. * later than the ifModifiedSince param.

@ -56,15 +56,22 @@ import java.sql.ResultSet;
import java.sql.SQLException; import java.sql.SQLException;
import java.sql.Timestamp; import java.sql.Timestamp;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection;
import java.util.Date; import java.util.Date;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.StringJoiner; import java.util.StringJoiner;
public abstract class AbstractDeviceDAOImpl implements DeviceDAO { public abstract class AbstractDeviceDAOImpl implements DeviceDAO {
private static final org.apache.commons.logging.Log log = LogFactory.getLog(AbstractDeviceDAOImpl.class); private static final org.apache.commons.logging.Log log = LogFactory.getLog(AbstractDeviceDAOImpl.class);
private static final String PROPERTY_KEY_COLUMN_NAME = "PROPERTY_NAME";
private static final String PROPERTY_VALUE_COLUMN_NAME = "PROPERTY_VALUE";
private static final String PROPERTY_DEVICE_TYPE_NAME = "DEVICE_TYPE_NAME";
private static final String PROPERTY_DEVICE_IDENTIFICATION = "DEVICE_IDENTIFICATION";
@Override @Override
public int addDevice(int typeId, Device device, int tenantId) throws DeviceManagementDAOException { public int addDevice(int typeId, Device device, int tenantId) throws DeviceManagementDAOException {
Connection conn; Connection conn;
@ -282,6 +289,103 @@ public abstract class AbstractDeviceDAOImpl implements DeviceDAO {
return device; return device;
} }
@Override
public List<Device> getDeviceBasedOnDeviceProperties(Map<String,String> deviceProps, int tenantId)
throws DeviceManagementDAOException {
Connection conn = null;
PreparedStatement stmt = null;
ResultSet resultSet = null;
List<Device> devices = new ArrayList<>();
try {
List<List<String>> outputLists = new ArrayList<>();
List<String> deviceList = null;
conn = this.getConnection();
for (Map.Entry<String, String> entry : deviceProps.entrySet()) {
stmt = conn.prepareStatement("SELECT DEVICE_IDENTIFICATION FROM DM_DEVICE_PROPERTIES " +
"WHERE (PROPERTY_NAME , PROPERTY_VALUE) IN " +
"((? , ?)) AND TENANT_ID = ?");
stmt.setString(1, entry.getKey());
stmt.setString(2, entry.getValue());
stmt.setInt(3, tenantId);
resultSet = stmt.executeQuery();
deviceList = new ArrayList<>();
while (resultSet.next()) {
deviceList.add(resultSet.getString(PROPERTY_DEVICE_IDENTIFICATION));
}
outputLists.add(deviceList);
}
List<String> deviceIds = findIntersection(outputLists);
for(String deviceId : deviceIds){
devices.add(getDeviceProps(deviceId, tenantId));
}
} catch (SQLException e) {
String msg = "Error occurred while fetching devices against criteria : '" + deviceProps;
log.error(msg, e);
throw new DeviceManagementDAOException(msg, e);
} finally {
DeviceManagementDAOUtil.cleanupResources(stmt, resultSet);
}
return devices;
}
@Override
public Device getDeviceProps(String deviceId, int tenantId) throws DeviceManagementDAOException {
Connection conn = null;
PreparedStatement stmt = null;
Device device = null;
ResultSet resultSet = null;
String deviceType = null;
try {
conn = this.getConnection();
stmt = conn.prepareStatement(
"SELECT * FROM DM_DEVICE_PROPERTIES WHERE DEVICE_IDENTIFICATION = ? AND TENANT_ID = ?");
stmt.setString(1, deviceId);
stmt.setInt(2, tenantId);
resultSet = stmt.executeQuery();
List<Device.Property> properties = new ArrayList<>();
while (resultSet.next()) {
Device.Property property = new Device.Property();
property.setName(resultSet.getString(PROPERTY_KEY_COLUMN_NAME));
property.setValue(resultSet.getString(PROPERTY_VALUE_COLUMN_NAME));
properties.add(property);
//We are repeatedly assigning device type here. Yes. This was done intentionally, as there would be
//No other efficient/simple/inexpensive way of retrieving device type of a particular device from the database
//Note that device-identification will be unique across device types
deviceType = resultSet.getString(PROPERTY_DEVICE_TYPE_NAME);
}
device = new Device();
device.setDeviceIdentifier(deviceId);
device.setType(deviceType);
device.setProperties(properties);
} catch (SQLException e) {
String msg = "Error occurred while fetching properties for device : '" + deviceId;
log.error(msg, e);
throw new DeviceManagementDAOException(msg, e);
} finally {
DeviceManagementDAOUtil.cleanupResources(stmt, resultSet);
}
return device;
}
private List<String> findIntersection(List<List<String>> collections) {
boolean first = true;
List<String> intersectedResult = new ArrayList<>();
for (Collection<String> collection : collections) {
if (first) {
intersectedResult.addAll(collection);
first = false;
} else {
intersectedResult.retainAll(collection);
}
}
return intersectedResult;
}
@Override @Override
public Device getDevice(String deviceIdentifier, Date since, int tenantId) public Device getDevice(String deviceIdentifier, Date since, int tenantId)
throws DeviceManagementDAOException { throws DeviceManagementDAOException {
@ -1409,91 +1513,97 @@ public abstract class AbstractDeviceDAOImpl implements DeviceDAO {
} }
public void deleteDevice(DeviceIdentifier deviceIdentifier, int tenantId) throws DeviceManagementDAOException { public void deleteDevice(DeviceIdentifier deviceIdentifier, int tenantId) throws DeviceManagementDAOException {
String deviceIdentifierId = deviceIdentifier.getId();
String deviceType = deviceIdentifier.getType();
Connection conn; Connection conn;
try { try {
conn = this.getConnection(); conn = this.getConnection();
int deviceId = getDeviceId(conn, deviceIdentifier, tenantId); int deviceId = getDeviceId(conn, deviceIdentifier, tenantId);
if (deviceId == -1) { if (deviceId == -1) {
String msg = "Device " + deviceIdentifier.getId() + " of type " + deviceIdentifier.getType() + String msg = "Device " + deviceIdentifierId + " of type " + deviceType + " is not found";
" is not found";
log.error(msg); log.error(msg);
throw new DeviceManagementDAOException(msg); throw new DeviceManagementDAOException(msg);
} else { } else {
int enrollmentId = getEnrollmentId(conn, deviceId, tenantId); List<Integer> enrollmentIds = getEnrollmentIds(conn, deviceId, tenantId);
if (enrollmentId == -1) { if (enrollmentIds == null || enrollmentIds.isEmpty()) {
String msg = "Enrollment not found for the device " + deviceIdentifier.getId() + " of type " + String msg = "Enrollments not found for the device " + deviceIdentifierId + " of type "
deviceIdentifier.getType(); + deviceType;
log.error(msg); log.error(msg);
throw new DeviceManagementDAOException(msg); throw new DeviceManagementDAOException(msg);
} else { } else {
removeDeviceDetail(conn, deviceId); removeDeviceDetail(conn, deviceId);
if (log.isDebugEnabled()) { if (log.isDebugEnabled()) {
log.debug("Successfully removed device detail data"); log.debug("Successfully removed device detail data of device " + deviceIdentifierId
+ " of type " + deviceType);
} }
removeDeviceLocation(conn, deviceId); removeDeviceLocation(conn, deviceId);
if (log.isDebugEnabled()) { if (log.isDebugEnabled()) {
log.debug("Successfully removed device location data"); log.debug("Successfully removed device location data of device " + deviceIdentifierId
+ " of type " + deviceType);
} }
removeDeviceInfo(conn, deviceId); removeDeviceInfo(conn, deviceId);
if (log.isDebugEnabled()) { if (log.isDebugEnabled()) {
log.debug("Successfully removed device info data"); log.debug("Successfully removed device info data of device " + deviceIdentifierId
+ " of type " + deviceType);
} }
removeDeviceNotification(conn, deviceId); removeDeviceNotification(conn, deviceId);
if (log.isDebugEnabled()) { if (log.isDebugEnabled()) {
log.debug("Successfully removed device notification data"); log.debug("Successfully removed device notification data of device " + deviceIdentifierId
+ " of type " + deviceType);
} }
removeDeviceApplicationMapping(conn, deviceId); removeDeviceApplicationMapping(conn, deviceId);
if (log.isDebugEnabled()) { if (log.isDebugEnabled()) {
log.debug("Successfully removed device application mapping data"); log.debug("Successfully removed device application mapping data of device "
+ deviceIdentifierId + " of type " + deviceType);
} }
removeDevicePolicyApplied(conn, deviceId); removeDevicePolicyApplied(conn, deviceId);
if (log.isDebugEnabled()) { if (log.isDebugEnabled()) {
log.debug("Successfully removed device applied policy data"); log.debug("Successfully removed device applied policy data of device " + deviceIdentifierId
+ " of type " + deviceType);
} }
removeDevicePolicy(conn, deviceId); removeDevicePolicy(conn, deviceId);
if (log.isDebugEnabled()) { if (log.isDebugEnabled()) {
log.debug("Successfully removed device policy data"); log.debug("Successfully removed device policy data of device " + deviceIdentifierId
+ " of type " + deviceType);
} }
removeEnrollmentDeviceDetail(conn, enrollmentId);
if (log.isDebugEnabled()) { if (log.isDebugEnabled()) {
log.debug("Successfully removed enrollment device detail data"); log.debug("Starting to remove " + enrollmentIds.size() + " enrollment data of device "
+ deviceIdentifierId + " of type " + deviceType);
} }
for (Integer enrollmentId : enrollmentIds) {
removeEnrollmentDeviceDetail(conn, enrollmentId);
removeEnrollmentDeviceLocation(conn, enrollmentId); removeEnrollmentDeviceLocation(conn, enrollmentId);
if (log.isDebugEnabled()) {
log.debug("Successfully removed enrollment device location data");
}
removeEnrollmentDeviceInfo(conn, enrollmentId); removeEnrollmentDeviceInfo(conn, enrollmentId);
if (log.isDebugEnabled()) {
log.debug("Successfully removed enrollment device info data");
}
removeEnrollmentDeviceApplicationMapping(conn, enrollmentId); removeEnrollmentDeviceApplicationMapping(conn, enrollmentId);
if (log.isDebugEnabled()) {
log.debug("Successfully removed enrollment device application mapping data");
}
removeDeviceOperationResponse(conn, enrollmentId); removeDeviceOperationResponse(conn, enrollmentId);
if (log.isDebugEnabled()) {
log.debug("Successfully removed device operation response data");
}
removeEnrollmentOperationMapping(conn, enrollmentId); removeEnrollmentOperationMapping(conn, enrollmentId);
}
if (log.isDebugEnabled()) { if (log.isDebugEnabled()) {
log.debug("Successfully removed enrollment operation mapping data"); log.debug("Successfully removed enrollment device details, enrollment device location, " +
"enrollment device info, enrollment device application mapping, " +
"enrollment device operation response, enrollment operation mapping data of device "
+ deviceIdentifierId + " of type " + deviceType);
} }
removeDeviceEnrollment(conn, deviceId); removeDeviceEnrollment(conn, deviceId);
if (log.isDebugEnabled()) { if (log.isDebugEnabled()) {
log.debug("Successfully removed device enrollment data"); log.debug("Successfully removed device enrollment data of device " + deviceIdentifierId
+ " of type " + deviceType);
} }
removeDeviceGroupMapping(conn, deviceId); removeDeviceGroupMapping(conn, deviceId);
if (log.isDebugEnabled()) { if (log.isDebugEnabled()) {
log.debug("Successfully removed device group mapping data"); log.debug("Successfully removed device group mapping data of device " + deviceIdentifierId
+ " of type " + deviceType);
} }
removeDevice(conn, deviceId); removeDevice(conn, deviceId);
if (log.isDebugEnabled()) { if (log.isDebugEnabled()) {
log.debug("Successfully permanently deleted the device"); log.debug("Successfully permanently deleted the device of device " + deviceIdentifierId
+ " of type " + deviceType);
} }
} }
} }
} catch (SQLException e) { } catch (SQLException e) {
throw new DeviceManagementDAOException("Error occurred while deleting the device", e); throw new DeviceManagementDAOException("Error occurred while deleting the device " + deviceIdentifierId
+ " of type " + deviceType, e);
} }
} }
@ -1519,30 +1629,29 @@ public abstract class AbstractDeviceDAOImpl implements DeviceDAO {
return deviceId; return deviceId;
} }
private int getEnrollmentId(Connection conn, int deviceId, int tenantId) throws DeviceManagementDAOException { private List<Integer> getEnrollmentIds(Connection conn, int deviceId, int tenantId) throws DeviceManagementDAOException {
PreparedStatement stmt = null; PreparedStatement stmt = null;
ResultSet rs = null; ResultSet rs = null;
int enrollmentId = -1; List<Integer> enrollmentIds = new ArrayList<>();
try { try {
String sql = "SELECT ID FROM DM_ENROLMENT WHERE DEVICE_ID = ? AND TENANT_ID = ?"; String sql = "SELECT ID FROM DM_ENROLMENT WHERE DEVICE_ID = ? AND TENANT_ID = ?";
stmt = conn.prepareStatement(sql); stmt = conn.prepareStatement(sql);
stmt.setInt(1, deviceId); stmt.setInt(1, deviceId);
stmt.setInt(2, tenantId); stmt.setInt(2, tenantId);
rs = stmt.executeQuery(); rs = stmt.executeQuery();
if (rs.next()) { while (rs.next()) {
enrollmentId = rs.getInt("ID"); enrollmentIds.add(rs.getInt("ID"));
} }
} catch (SQLException e) { } catch (SQLException e) {
throw new DeviceManagementDAOException("Error occurred while retrieving enrollment id of the device", e); throw new DeviceManagementDAOException("Error occurred while retrieving enrollment id of the device", e);
} finally { } finally {
DeviceManagementDAOUtil.cleanupResources(stmt, rs); DeviceManagementDAOUtil.cleanupResources(stmt, rs);
} }
return enrollmentId; return enrollmentIds;
} }
private void removeDeviceDetail(Connection conn, int deviceId) throws DeviceManagementDAOException { private void removeDeviceDetail(Connection conn, int deviceId) throws DeviceManagementDAOException {
PreparedStatement stmt = null; PreparedStatement stmt = null;
ResultSet rs = null;
try { try {
String sql = "DELETE FROM DM_DEVICE_DETAIL WHERE DEVICE_ID = ?"; String sql = "DELETE FROM DM_DEVICE_DETAIL WHERE DEVICE_ID = ?";
stmt = conn.prepareStatement(sql); stmt = conn.prepareStatement(sql);
@ -1551,13 +1660,12 @@ public abstract class AbstractDeviceDAOImpl implements DeviceDAO {
} catch (SQLException e) { } catch (SQLException e) {
throw new DeviceManagementDAOException("Error occurred while removing device detail", e); throw new DeviceManagementDAOException("Error occurred while removing device detail", e);
} finally { } finally {
DeviceManagementDAOUtil.cleanupResources(stmt, rs); DeviceManagementDAOUtil.cleanupResources(stmt, null);
} }
} }
private void removeDeviceLocation(Connection conn, int deviceId) throws DeviceManagementDAOException { private void removeDeviceLocation(Connection conn, int deviceId) throws DeviceManagementDAOException {
PreparedStatement stmt = null; PreparedStatement stmt = null;
ResultSet rs = null;
try { try {
String sql = "DELETE FROM DM_DEVICE_LOCATION WHERE DEVICE_ID = ?"; String sql = "DELETE FROM DM_DEVICE_LOCATION WHERE DEVICE_ID = ?";
stmt = conn.prepareStatement(sql); stmt = conn.prepareStatement(sql);
@ -1566,13 +1674,12 @@ public abstract class AbstractDeviceDAOImpl implements DeviceDAO {
} catch (SQLException e) { } catch (SQLException e) {
throw new DeviceManagementDAOException("Error occurred while removing device location", e); throw new DeviceManagementDAOException("Error occurred while removing device location", e);
} finally { } finally {
DeviceManagementDAOUtil.cleanupResources(stmt, rs); DeviceManagementDAOUtil.cleanupResources(stmt, null);
} }
} }
private void removeDeviceInfo(Connection conn, int deviceId) throws DeviceManagementDAOException { private void removeDeviceInfo(Connection conn, int deviceId) throws DeviceManagementDAOException {
PreparedStatement stmt = null; PreparedStatement stmt = null;
ResultSet rs = null;
try { try {
String sql = "DELETE FROM DM_DEVICE_INFO WHERE DEVICE_ID = ?"; String sql = "DELETE FROM DM_DEVICE_INFO WHERE DEVICE_ID = ?";
stmt = conn.prepareStatement(sql); stmt = conn.prepareStatement(sql);
@ -1581,13 +1688,12 @@ public abstract class AbstractDeviceDAOImpl implements DeviceDAO {
} catch (SQLException e) { } catch (SQLException e) {
throw new DeviceManagementDAOException("Error occurred while removing device info", e); throw new DeviceManagementDAOException("Error occurred while removing device info", e);
} finally { } finally {
DeviceManagementDAOUtil.cleanupResources(stmt, rs); DeviceManagementDAOUtil.cleanupResources(stmt, null);
} }
} }
private void removeDeviceNotification(Connection conn, int deviceId) throws DeviceManagementDAOException { private void removeDeviceNotification(Connection conn, int deviceId) throws DeviceManagementDAOException {
PreparedStatement stmt = null; PreparedStatement stmt = null;
ResultSet rs = null;
try { try {
String sql = "DELETE FROM DM_NOTIFICATION WHERE DEVICE_ID = ?"; String sql = "DELETE FROM DM_NOTIFICATION WHERE DEVICE_ID = ?";
stmt = conn.prepareStatement(sql); stmt = conn.prepareStatement(sql);
@ -1596,13 +1702,12 @@ public abstract class AbstractDeviceDAOImpl implements DeviceDAO {
} catch (SQLException e) { } catch (SQLException e) {
throw new DeviceManagementDAOException("Error occurred while removing device notification", e); throw new DeviceManagementDAOException("Error occurred while removing device notification", e);
} finally { } finally {
DeviceManagementDAOUtil.cleanupResources(stmt, rs); DeviceManagementDAOUtil.cleanupResources(stmt, null);
} }
} }
private void removeDeviceApplicationMapping(Connection conn, int deviceId) throws DeviceManagementDAOException { private void removeDeviceApplicationMapping(Connection conn, int deviceId) throws DeviceManagementDAOException {
PreparedStatement stmt = null; PreparedStatement stmt = null;
ResultSet rs = null;
try { try {
String sql = "DELETE FROM DM_DEVICE_APPLICATION_MAPPING WHERE DEVICE_ID = ?"; String sql = "DELETE FROM DM_DEVICE_APPLICATION_MAPPING WHERE DEVICE_ID = ?";
stmt = conn.prepareStatement(sql); stmt = conn.prepareStatement(sql);
@ -1611,13 +1716,12 @@ public abstract class AbstractDeviceDAOImpl implements DeviceDAO {
} catch (SQLException e) { } catch (SQLException e) {
throw new DeviceManagementDAOException("Error occurred while removing device application mapping", e); throw new DeviceManagementDAOException("Error occurred while removing device application mapping", e);
} finally { } finally {
DeviceManagementDAOUtil.cleanupResources(stmt, rs); DeviceManagementDAOUtil.cleanupResources(stmt, null);
} }
} }
private void removeDevicePolicyApplied(Connection conn, int deviceId) throws DeviceManagementDAOException { private void removeDevicePolicyApplied(Connection conn, int deviceId) throws DeviceManagementDAOException {
PreparedStatement stmt = null; PreparedStatement stmt = null;
ResultSet rs = null;
try { try {
String sql = "DELETE FROM DM_DEVICE_POLICY_APPLIED WHERE DEVICE_ID = ?"; String sql = "DELETE FROM DM_DEVICE_POLICY_APPLIED WHERE DEVICE_ID = ?";
stmt = conn.prepareStatement(sql); stmt = conn.prepareStatement(sql);
@ -1626,13 +1730,12 @@ public abstract class AbstractDeviceDAOImpl implements DeviceDAO {
} catch (SQLException e) { } catch (SQLException e) {
throw new DeviceManagementDAOException("Error occurred while removing device policy applied", e); throw new DeviceManagementDAOException("Error occurred while removing device policy applied", e);
} finally { } finally {
DeviceManagementDAOUtil.cleanupResources(stmt, rs); DeviceManagementDAOUtil.cleanupResources(stmt, null);
} }
} }
private void removeDevicePolicy(Connection conn, int deviceId) throws DeviceManagementDAOException { private void removeDevicePolicy(Connection conn, int deviceId) throws DeviceManagementDAOException {
PreparedStatement stmt = null; PreparedStatement stmt = null;
ResultSet rs = null;
try { try {
String sql = "DELETE FROM DM_DEVICE_POLICY WHERE DEVICE_ID = ?"; String sql = "DELETE FROM DM_DEVICE_POLICY WHERE DEVICE_ID = ?";
stmt = conn.prepareStatement(sql); stmt = conn.prepareStatement(sql);
@ -1641,13 +1744,12 @@ public abstract class AbstractDeviceDAOImpl implements DeviceDAO {
} catch (SQLException e) { } catch (SQLException e) {
throw new DeviceManagementDAOException("Error occurred while removing device policy", e); throw new DeviceManagementDAOException("Error occurred while removing device policy", e);
} finally { } finally {
DeviceManagementDAOUtil.cleanupResources(stmt, rs); DeviceManagementDAOUtil.cleanupResources(stmt, null);
} }
} }
private void removeEnrollmentDeviceDetail(Connection conn, int enrollmentId) throws DeviceManagementDAOException { private void removeEnrollmentDeviceDetail(Connection conn, int enrollmentId) throws DeviceManagementDAOException {
PreparedStatement stmt = null; PreparedStatement stmt = null;
ResultSet rs = null;
try { try {
String sql = "DELETE FROM DM_DEVICE_DETAIL WHERE ENROLMENT_ID = ?"; String sql = "DELETE FROM DM_DEVICE_DETAIL WHERE ENROLMENT_ID = ?";
stmt = conn.prepareStatement(sql); stmt = conn.prepareStatement(sql);
@ -1656,13 +1758,12 @@ public abstract class AbstractDeviceDAOImpl implements DeviceDAO {
} catch (SQLException e) { } catch (SQLException e) {
throw new DeviceManagementDAOException("Error occurred while removing enrollment device detail", e); throw new DeviceManagementDAOException("Error occurred while removing enrollment device detail", e);
} finally { } finally {
DeviceManagementDAOUtil.cleanupResources(stmt, rs); DeviceManagementDAOUtil.cleanupResources(stmt, null);
} }
} }
private void removeEnrollmentDeviceLocation(Connection conn, int enrollmentId) throws DeviceManagementDAOException { private void removeEnrollmentDeviceLocation(Connection conn, int enrollmentId) throws DeviceManagementDAOException {
PreparedStatement stmt = null; PreparedStatement stmt = null;
ResultSet rs = null;
try { try {
String sql = "DELETE FROM DM_DEVICE_LOCATION WHERE ENROLMENT_ID = ?"; String sql = "DELETE FROM DM_DEVICE_LOCATION WHERE ENROLMENT_ID = ?";
stmt = conn.prepareStatement(sql); stmt = conn.prepareStatement(sql);
@ -1671,13 +1772,12 @@ public abstract class AbstractDeviceDAOImpl implements DeviceDAO {
} catch (SQLException e) { } catch (SQLException e) {
throw new DeviceManagementDAOException("Error occurred while removing enrollment device location", e); throw new DeviceManagementDAOException("Error occurred while removing enrollment device location", e);
} finally { } finally {
DeviceManagementDAOUtil.cleanupResources(stmt, rs); DeviceManagementDAOUtil.cleanupResources(stmt, null);
} }
} }
private void removeEnrollmentDeviceInfo(Connection conn, int enrollmentId) throws DeviceManagementDAOException { private void removeEnrollmentDeviceInfo(Connection conn, int enrollmentId) throws DeviceManagementDAOException {
PreparedStatement stmt = null; PreparedStatement stmt = null;
ResultSet rs = null;
try { try {
String sql = "DELETE FROM DM_DEVICE_INFO WHERE ENROLMENT_ID = ?"; String sql = "DELETE FROM DM_DEVICE_INFO WHERE ENROLMENT_ID = ?";
stmt = conn.prepareStatement(sql); stmt = conn.prepareStatement(sql);
@ -1686,14 +1786,13 @@ public abstract class AbstractDeviceDAOImpl implements DeviceDAO {
} catch (SQLException e) { } catch (SQLException e) {
throw new DeviceManagementDAOException("Error occurred while removing enrollment device info", e); throw new DeviceManagementDAOException("Error occurred while removing enrollment device info", e);
} finally { } finally {
DeviceManagementDAOUtil.cleanupResources(stmt, rs); DeviceManagementDAOUtil.cleanupResources(stmt, null);
} }
} }
private void removeEnrollmentDeviceApplicationMapping(Connection conn, int enrollmentId) private void removeEnrollmentDeviceApplicationMapping(Connection conn, int enrollmentId)
throws DeviceManagementDAOException { throws DeviceManagementDAOException {
PreparedStatement stmt = null; PreparedStatement stmt = null;
ResultSet rs = null;
try { try {
String sql = "DELETE FROM DM_DEVICE_APPLICATION_MAPPING WHERE ENROLMENT_ID = ?"; String sql = "DELETE FROM DM_DEVICE_APPLICATION_MAPPING WHERE ENROLMENT_ID = ?";
stmt = conn.prepareStatement(sql); stmt = conn.prepareStatement(sql);
@ -1703,13 +1802,12 @@ public abstract class AbstractDeviceDAOImpl implements DeviceDAO {
throw new DeviceManagementDAOException("Error occurred while removing enrollment device application " + throw new DeviceManagementDAOException("Error occurred while removing enrollment device application " +
"mapping", e); "mapping", e);
} finally { } finally {
DeviceManagementDAOUtil.cleanupResources(stmt, rs); DeviceManagementDAOUtil.cleanupResources(stmt, null);
} }
} }
private void removeDeviceOperationResponse(Connection conn, int enrollmentId) throws DeviceManagementDAOException { private void removeDeviceOperationResponse(Connection conn, int enrollmentId) throws DeviceManagementDAOException {
PreparedStatement stmt = null; PreparedStatement stmt = null;
ResultSet rs = null;
try { try {
String sql = "DELETE FROM DM_DEVICE_OPERATION_RESPONSE WHERE ENROLMENT_ID = ?"; String sql = "DELETE FROM DM_DEVICE_OPERATION_RESPONSE WHERE ENROLMENT_ID = ?";
stmt = conn.prepareStatement(sql); stmt = conn.prepareStatement(sql);
@ -1718,14 +1816,13 @@ public abstract class AbstractDeviceDAOImpl implements DeviceDAO {
} catch (SQLException e) { } catch (SQLException e) {
throw new DeviceManagementDAOException("Error occurred while removing device operation response", e); throw new DeviceManagementDAOException("Error occurred while removing device operation response", e);
} finally { } finally {
DeviceManagementDAOUtil.cleanupResources(stmt, rs); DeviceManagementDAOUtil.cleanupResources(stmt, null);
} }
} }
private void removeEnrollmentOperationMapping(Connection conn, int enrollmentId) private void removeEnrollmentOperationMapping(Connection conn, int enrollmentId)
throws DeviceManagementDAOException { throws DeviceManagementDAOException {
PreparedStatement stmt = null; PreparedStatement stmt = null;
ResultSet rs = null;
try { try {
String sql = "DELETE FROM DM_ENROLMENT_OP_MAPPING WHERE ENROLMENT_ID = ?"; String sql = "DELETE FROM DM_ENROLMENT_OP_MAPPING WHERE ENROLMENT_ID = ?";
stmt = conn.prepareStatement(sql); stmt = conn.prepareStatement(sql);
@ -1734,13 +1831,12 @@ public abstract class AbstractDeviceDAOImpl implements DeviceDAO {
} catch (SQLException e) { } catch (SQLException e) {
throw new DeviceManagementDAOException("Error occurred while removing enrollment operation mapping", e); throw new DeviceManagementDAOException("Error occurred while removing enrollment operation mapping", e);
} finally { } finally {
DeviceManagementDAOUtil.cleanupResources(stmt, rs); DeviceManagementDAOUtil.cleanupResources(stmt, null);
} }
} }
private void removeDeviceEnrollment(Connection conn, int deviceId) throws DeviceManagementDAOException { private void removeDeviceEnrollment(Connection conn, int deviceId) throws DeviceManagementDAOException {
PreparedStatement stmt = null; PreparedStatement stmt = null;
ResultSet rs = null;
try { try {
String sql = "DELETE FROM DM_ENROLMENT WHERE DEVICE_ID = ?"; String sql = "DELETE FROM DM_ENROLMENT WHERE DEVICE_ID = ?";
stmt = conn.prepareStatement(sql); stmt = conn.prepareStatement(sql);
@ -1749,13 +1845,12 @@ public abstract class AbstractDeviceDAOImpl implements DeviceDAO {
} catch (SQLException e) { } catch (SQLException e) {
throw new DeviceManagementDAOException("Error occurred while removing device enrollment", e); throw new DeviceManagementDAOException("Error occurred while removing device enrollment", e);
} finally { } finally {
DeviceManagementDAOUtil.cleanupResources(stmt, rs); DeviceManagementDAOUtil.cleanupResources(stmt, null);
} }
} }
private void removeDeviceGroupMapping(Connection conn, int deviceId) throws DeviceManagementDAOException { private void removeDeviceGroupMapping(Connection conn, int deviceId) throws DeviceManagementDAOException {
PreparedStatement stmt = null; PreparedStatement stmt = null;
ResultSet rs = null;
try { try {
String sql = "DELETE FROM DM_DEVICE_GROUP_MAP WHERE DEVICE_ID = ?"; String sql = "DELETE FROM DM_DEVICE_GROUP_MAP WHERE DEVICE_ID = ?";
stmt = conn.prepareStatement(sql); stmt = conn.prepareStatement(sql);
@ -1764,13 +1859,12 @@ public abstract class AbstractDeviceDAOImpl implements DeviceDAO {
} catch (SQLException e) { } catch (SQLException e) {
throw new DeviceManagementDAOException("Error occurred while removing device group mapping", e); throw new DeviceManagementDAOException("Error occurred while removing device group mapping", e);
} finally { } finally {
DeviceManagementDAOUtil.cleanupResources(stmt, rs); DeviceManagementDAOUtil.cleanupResources(stmt, null);
} }
} }
private void removeDevice(Connection conn, int deviceId) throws DeviceManagementDAOException { private void removeDevice(Connection conn, int deviceId) throws DeviceManagementDAOException {
PreparedStatement stmt = null; PreparedStatement stmt = null;
ResultSet rs = null;
try { try {
String sql = "DELETE FROM DM_DEVICE WHERE ID = ?"; String sql = "DELETE FROM DM_DEVICE WHERE ID = ?";
stmt = conn.prepareStatement(sql); stmt = conn.prepareStatement(sql);
@ -1779,7 +1873,7 @@ public abstract class AbstractDeviceDAOImpl implements DeviceDAO {
} catch (SQLException e) { } catch (SQLException e) {
throw new DeviceManagementDAOException("Error occurred while removing device", e); throw new DeviceManagementDAOException("Error occurred while removing device", e);
} finally { } finally {
DeviceManagementDAOUtil.cleanupResources(stmt, rs); DeviceManagementDAOUtil.cleanupResources(stmt, null);
} }
} }
} }

@ -66,6 +66,7 @@ import org.wso2.carbon.device.mgt.core.geo.geoHash.GeoCoordinate;
import java.util.Date; import java.util.Date;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map;
/** /**
* Proxy class for all Device Management related operations that take the corresponding plugin type in * Proxy class for all Device Management related operations that take the corresponding plugin type in
@ -255,6 +256,15 @@ public interface DeviceManagementProviderService {
*/ */
Device getDevice(DeviceIdentifier deviceId, Date since, boolean requireDeviceInfo) throws DeviceManagementException; Device getDevice(DeviceIdentifier deviceId, Date since, boolean requireDeviceInfo) throws DeviceManagementException;
/**
* Retrieves a list of devices based on a given criteria of properties
*
* @param deviceProps properties by which devices need to be drawn
* @return list of devices
* @throws DeviceManagementException
*/
List<Device> getDevicesBasedOnProperties(Map deviceProps) throws DeviceManagementException;
/** /**
* Returns the device of specified id. * Returns the device of specified id.
* *

@ -14,11 +14,11 @@
* KIND, either express or implied. See the License for the * KIND, either express or implied. See the License for the
* specific language governing permissions and limitations * specific language governing permissions and limitations
* under the License. * under the License.
*/
/*
* Copyright (c) 2019, Entgra (pvt) Ltd. (http://entgra.io) All Rights Reserved.
* *
* Entgra (pvt) Ltd. licenses this file to you under the Apache License, *
* Copyright (c) 2019, Entgra (Pvt) Ltd. (http://entgra.io) All Rights Reserved.
*
* Entgra (Pvt) Ltd. licenses this file to you under the Apache License,
* Version 2.0 (the "License"); you may not use this file except * Version 2.0 (the "License"); you may not use this file except
* in compliance with the License. * in compliance with the License.
* You may obtain a copy of the License at * You may obtain a copy of the License at
@ -553,6 +553,14 @@ public class DeviceManagementProviderServiceImpl implements DeviceManagementProv
try { try {
DeviceManagementDAOFactory.beginTransaction(); DeviceManagementDAOFactory.beginTransaction();
deviceDAO.deleteDevice(deviceId, tenantId); deviceDAO.deleteDevice(deviceId, tenantId);
try {
deviceManager.deleteDevice(deviceId, device);
} catch (DeviceManagementException e) {
String msg = "Error occurred while permanently deleting '" + deviceId.getType() +
"' device with the identifier '" + deviceId.getId() + "' in plugin.";
log.error(msg, e);
throw new DeviceManagementDAOException(msg, e);
}
DeviceManagementDAOFactory.commitTransaction(); DeviceManagementDAOFactory.commitTransaction();
this.removeDeviceFromCache(deviceId); this.removeDeviceFromCache(deviceId);
} catch (DeviceManagementDAOException e) { } catch (DeviceManagementDAOException e) {
@ -1201,6 +1209,46 @@ public class DeviceManagementProviderServiceImpl implements DeviceManagementProv
return device; return device;
} }
@Override
public List<Device> getDevicesBasedOnProperties(Map deviceProps) throws DeviceManagementException {
if (deviceProps == null || deviceProps.isEmpty()) {
String msg = "Devices retrieval criteria cannot be null or empty.";
log.error(msg);
throw new DeviceManagementException(msg);
}
if (log.isDebugEnabled()) {
log.debug("Attempting to get devices based on criteria : " + deviceProps);
}
List<Device> devices;
try {
int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId();
DeviceManagementDAOFactory.openConnection();
devices = deviceDAO.getDeviceBasedOnDeviceProperties(deviceProps, tenantId);
if (devices == null) {
if (log.isDebugEnabled()) {
log.debug("No device is found against criteria : " + deviceProps + " and tenantId "+ tenantId);
}
return null;
}
} catch (DeviceManagementDAOException e) {
String msg = "Error occurred while obtaining devices based on criteria : " + deviceProps;
log.error(msg, e);
throw new DeviceManagementException(msg, e);
} catch (SQLException e) {
String msg = "Error occurred while opening a connection to the data source";
log.error(msg, e);
throw new DeviceManagementException(msg, e);
} catch (Exception e) {
String msg = "Error occurred while obtaining devices based on criteria : " + deviceProps;
log.error(msg, e);
throw new DeviceManagementException(msg, e);
} finally {
DeviceManagementDAOFactory.closeConnection();
}
return devices;
}
@Override @Override
public Device getDevice(String deviceId, Date since, boolean requireDeviceInfo) throws DeviceManagementException { public Device getDevice(String deviceId, Date since, boolean requireDeviceInfo) throws DeviceManagementException {
if (deviceId == null || since == null) { if (deviceId == null || since == null) {

@ -60,6 +60,11 @@ public class TestDeviceManager implements DeviceManager {
return true; return true;
} }
@Override
public boolean deleteDevice(DeviceIdentifier deviceId, Device device) throws DeviceManagementException {
return true;
}
@Override @Override
public boolean isEnrolled(DeviceIdentifier deviceId) throws DeviceManagementException { public boolean isEnrolled(DeviceIdentifier deviceId) throws DeviceManagementException {
return true; return true;

@ -22,7 +22,7 @@
<parent> <parent>
<artifactId>device-mgt</artifactId> <artifactId>device-mgt</artifactId>
<groupId>org.wso2.carbon.devicemgt</groupId> <groupId>org.wso2.carbon.devicemgt</groupId>
<version>3.2.7-SNAPSHOT</version> <version>3.2.9-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath> <relativePath>../pom.xml</relativePath>
</parent> </parent>

@ -15,6 +15,22 @@
* specific language governing permissions and limitations * specific language governing permissions and limitations
* under the License. * under the License.
* *
*
* Copyright (c) 2019, Entgra (Pvt) Ltd. (http://entgra.io) All Rights Reserved.
*
* Entgra (Pvt) Ltd. licenses this file to you under the Apache License,
* Version 2.0 (the "License"); you may not use this file except
* in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/ */
package org.wso2.carbon.device.mgt.extensions.device.type.template; package org.wso2.carbon.device.mgt.extensions.device.type.template;
@ -568,4 +584,35 @@ public class DeviceTypeManager implements DeviceManager {
return null; return null;
} }
@Override
public boolean deleteDevice(DeviceIdentifier deviceIdentifier, Device device) throws DeviceManagementException {
if (propertiesExist) {
boolean status;
Device existingDevice = this.getDevice(deviceIdentifier);
if (existingDevice == null) {
return false;
}
try {
if (log.isDebugEnabled()) {
log.debug("Deleting the details of " + deviceType + " device : " + device.getDeviceIdentifier());
}
deviceTypePluginDAOManager.getDeviceTypeDAOHandler().beginTransaction();
status = deviceTypePluginDAOManager.getDeviceDAO().deleteDevice(existingDevice);
deviceTypePluginDAOManager.getDeviceTypeDAOHandler().commitTransaction();
} catch (DeviceTypeMgtPluginException e) {
try {
deviceTypePluginDAOManager.getDeviceTypeDAOHandler().rollbackTransaction();
} catch (DeviceTypeMgtPluginException e1) {
log.warn("Error occurred while roll back the delete device info transaction : '" +
device.toString() + "'", e1);
}
throw new DeviceManagementException(
"Error occurred while deleting the " + deviceType + " device: '" +
device.getDeviceIdentifier() + "'", e);
}
return status;
}
return true;
}
} }

@ -14,6 +14,23 @@
* KIND, either express or implied. See the License for the * KIND, either express or implied. See the License for the
* specific language governing permissions and limitations * specific language governing permissions and limitations
* under the License. * under the License.
*
*
* Copyright (c) 2019, Entgra (Pvt) Ltd. (http://entgra.io) All Rights Reserved.
*
* Entgra (Pvt) Ltd. licenses this file to you under the Apache License,
* Version 2.0 (the "License"); you may not use this file except
* in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/ */
package org.wso2.carbon.device.mgt.extensions.device.type.template.dao; package org.wso2.carbon.device.mgt.extensions.device.type.template.dao;
@ -45,6 +62,7 @@ public class DeviceTypePluginDAOImpl implements PluginDAO {
private String createDBqueryForAddDevice; private String createDBqueryForAddDevice;
private String updateDBQueryForUpdateDevice; private String updateDBQueryForUpdateDevice;
private String selectDBQueryToGetAllDevice; private String selectDBQueryToGetAllDevice;
private String deleteDBQueryForDeleteDevice;
public DeviceTypePluginDAOImpl(DeviceDAODefinition deviceDAODefinition, public DeviceTypePluginDAOImpl(DeviceDAODefinition deviceDAODefinition,
DeviceTypeDAOHandler deviceTypeDAOHandler) { DeviceTypeDAOHandler deviceTypeDAOHandler) {
@ -196,6 +214,33 @@ public class DeviceTypePluginDAOImpl implements PluginDAO {
} }
} }
@Override
public boolean deleteDevice(Device device) throws DeviceTypeMgtPluginException {
boolean status = false;
Connection conn;
PreparedStatement stmt = null;
try {
conn = deviceTypeDAOHandler.getConnection();
stmt = conn.prepareStatement(deleteDBQueryForDeleteDevice);
stmt.setString(1, device.getDeviceIdentifier());
int rows = stmt.executeUpdate();
if (rows > 0) {
status = true;
if (log.isDebugEnabled()) {
log.debug("Device " + device.getDeviceIdentifier() + " data has been deleted.");
}
}
} catch (SQLException e) {
String msg = "Error occurred while deleting the device '" + device.getDeviceIdentifier() + "' data in "
+ deviceDAODefinition.getDeviceTableName();
log.error(msg, e);
throw new DeviceTypeMgtPluginException(msg, e);
} finally {
DeviceTypeUtils.cleanupResources(stmt, null);
}
return status;
}
private String getDeviceTableColumnNames() { private String getDeviceTableColumnNames() {
return StringUtils.join(deviceDAODefinition.getColumnNames(), ", "); return StringUtils.join(deviceDAODefinition.getColumnNames(), ", ");
} }
@ -239,5 +284,8 @@ public class DeviceTypePluginDAOImpl implements PluginDAO {
selectDBQueryToGetAllDevice = selectDBQueryToGetAllDevice =
"SELECT " + getDeviceTableColumnNames() + "," + deviceDAODefinition.getPrimaryKey() + " FROM " "SELECT " + getDeviceTableColumnNames() + "," + deviceDAODefinition.getPrimaryKey() + " FROM "
+ deviceDAODefinition.getDeviceTableName(); + deviceDAODefinition.getDeviceTableName();
deleteDBQueryForDeleteDevice = "DELETE FROM " + deviceDAODefinition.getDeviceTableName() + " WHERE "
+ deviceDAODefinition.getPrimaryKey() + " = ?";
} }
} }

@ -14,12 +14,30 @@
* KIND, either express or implied. See the License for the * KIND, either express or implied. See the License for the
* specific language governing permissions and limitations * specific language governing permissions and limitations
* under the License. * under the License.
*
*
* Copyright (c) 2019, Entgra (Pvt) Ltd. (http://entgra.io) All Rights Reserved.
*
* Entgra (Pvt) Ltd. licenses this file to you under the Apache License,
* Version 2.0 (the "License"); you may not use this file except
* in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/ */
package org.wso2.carbon.device.mgt.extensions.device.type.template.dao; package org.wso2.carbon.device.mgt.extensions.device.type.template.dao;
import org.wso2.carbon.device.mgt.common.Device; import org.wso2.carbon.device.mgt.common.Device;
import org.wso2.carbon.device.mgt.extensions.device.type.template.exception.DeviceTypeMgtPluginException; import org.wso2.carbon.device.mgt.extensions.device.type.template.exception.DeviceTypeMgtPluginException;
import java.util.List; import java.util.List;
public interface PluginDAO { public interface PluginDAO {
@ -31,4 +49,6 @@ public interface PluginDAO {
boolean updateDevice(Device device) throws DeviceTypeMgtPluginException; boolean updateDevice(Device device) throws DeviceTypeMgtPluginException;
List<Device> getAllDevices() throws DeviceTypeMgtPluginException; List<Device> getAllDevices() throws DeviceTypeMgtPluginException;
boolean deleteDevice(Device device) throws DeviceTypeMgtPluginException;
} }

@ -14,6 +14,23 @@
* KIND, either express or implied. See the License for the * KIND, either express or implied. See the License for the
* specific language governing permissions and limitations * specific language governing permissions and limitations
* under the License. * under the License.
*
*
* Copyright (c) 2019, Entgra (Pvt) Ltd. (http://entgra.io) All Rights Reserved.
*
* Entgra (Pvt) Ltd. licenses this file to you under the Apache License,
* Version 2.0 (the "License"); you may not use this file except
* in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/ */
package org.wso2.carbon.device.mgt.extensions.device.type.template.dao; package org.wso2.carbon.device.mgt.extensions.device.type.template.dao;
@ -31,7 +48,6 @@ import java.sql.PreparedStatement;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.sql.SQLException; import java.sql.SQLException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@ -201,6 +217,27 @@ public class PropertyBasedPluginDAOImpl implements PluginDAO {
} }
} }
@Override
public boolean deleteDevice(Device device) throws DeviceTypeMgtPluginException {
Connection conn;
PreparedStatement stmt = null;
try {
conn = deviceTypeDAOHandler.getConnection();
stmt = conn.prepareStatement("DELETE FROM DM_DEVICE_PROPERTIES WHERE DEVICE_IDENTIFICATION = ?");
stmt.setString(1, device.getDeviceIdentifier());
stmt.executeUpdate();
return true;
} catch (SQLException e) {
String msg = "Error occurred while deleting the device '" + device.getDeviceIdentifier() + "' data on"
+ deviceType;
log.error(msg, e);
throw new DeviceTypeMgtPluginException(msg, e);
} finally {
DeviceTypeUtils.cleanupResources(stmt, null);
}
}
private String getPropertyValue(List<Device.Property> properties, String propertyName) { private String getPropertyValue(List<Device.Property> properties, String propertyName) {
for (Device.Property property : properties) { for (Device.Property property : properties) {
if (property.getName() != null && property.getName().equals(propertyName)) { if (property.getName() != null && property.getName().equals(propertyName)) {

@ -22,7 +22,7 @@
<parent> <parent>
<artifactId>device-mgt</artifactId> <artifactId>device-mgt</artifactId>
<groupId>org.wso2.carbon.devicemgt</groupId> <groupId>org.wso2.carbon.devicemgt</groupId>
<version>3.2.7-SNAPSHOT</version> <version>3.2.9-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath> <relativePath>../pom.xml</relativePath>
</parent> </parent>

@ -26,14 +26,14 @@
<div class="panel-body"> <div class="panel-body">
<h3>About Entgra IoT Server</h3> <h3>About Entgra IoT Server</h3>
<p>Entgra IoT Server 3.5.0 is a complete solution that enables device manufacturers and enterprises to <p>Entgra IoT Server 3.6.0 is a complete solution that enables device manufacturers and enterprises to
connect and manage their devices, build apps, manage events, secure devices and data, and visualize connect and manage their devices, build apps, manage events, secure devices and data, and visualize
sensor data in a scalable manner.</p> sensor data in a scalable manner.</p>
<p>It also offers a complete and secure Enterprise Mobility Management (EMM/MDM) solution that aims to <p>It also offers a complete and secure Enterprise Mobility Management (EMM/MDM) solution that aims to
address mobile computing challenges faced by enterprises today. Supporting iOS, Android, and Windows address mobile computing challenges faced by enterprises today. Supporting iOS, Android, and Windows
devices, it helps organizations deal with both Corporate Owned, Personally Enabled (COPE) and devices, it helps organizations deal with both Corporate Owned, Personally Enabled (COPE) and
employee-owned devices with the Bring Your Own Device (BYOD) concept.</p> employee-owned devices with the Bring Your Own Device (BYOD) concept.</p>
<p>Entgra IoT Server 3.5.0 comes with advanced analytics, enabling users to analyze speed, proximity, and <p>Entgra IoT Server 3.6.0 comes with advanced analytics, enabling users to analyze speed, proximity, and
geo-fencing information of devices including details of those in motion and stationary state.</p> geo-fencing information of devices including details of those in motion and stationary state.</p>
</p> </p>
<h2>Cookie Policy</h2> <h2>Cookie Policy</h2>
@ -45,12 +45,12 @@
apps remember things about you. Other technologies, including Web storage and identifiers associated apps remember things about you. Other technologies, including Web storage and identifiers associated
with your device, may be used for similar purposes. In this policy, we use the term “cookies” to with your device, may be used for similar purposes. In this policy, we use the term “cookies” to
discuss all of these technologies.</p> discuss all of these technologies.</p>
<h3>How does Entgra IoT Server 3.5.0 process cookies?</h3> <h3>How does Entgra IoT Server 3.6.0 process cookies?</h3>
<p>Entgra IoT Server 3.5.0 uses cookies to store and retrieve information on your browser. This <p>Entgra IoT Server 3.6.0 uses cookies to store and retrieve information on your browser. This
information is used to provide a better user experience. Some cookies serve the purpose of allowing a information is used to provide a better user experience. Some cookies serve the purpose of allowing a
user to log in to the system, maintain sessions, and keep track of activities within the login user to log in to the system, maintain sessions, and keep track of activities within the login
session.</p> session.</p>
<p>Some cookies in Entgra IoT Server 3.5.0 are used to personally identify you. However, the cookie <p>Some cookies in Entgra IoT Server 3.6.0 are used to personally identify you. However, the cookie
lifetime ends once your session ends, i.e., after you log-out, or after the session expiry time has lifetime ends once your session ends, i.e., after you log-out, or after the session expiry time has
elapsed.</p> elapsed.</p>
<p>Some cookies are simply used to give you a more personalised web experience, and these cannot be used <p>Some cookies are simply used to give you a more personalised web experience, and these cannot be used
@ -58,42 +58,42 @@
<p>This Cookie Policy is part of the IoT Server <a href="{{@app.context}}/privacy-policy">Privacy Policy.</a> <p>This Cookie Policy is part of the IoT Server <a href="{{@app.context}}/privacy-policy">Privacy Policy.</a>
</p> </p>
<h3>What does Entgra IoT Server 3.0.0 use cookies for?</h3> <h3>What does Entgra IoT Server 3.0.0 use cookies for?</h3>
<p>Cookies are used for two purposes in Entgra IoT Server 3.5.0.</p> <p>Cookies are used for two purposes in Entgra IoT Server 3.6.0.</p>
<ol> <ol>
<li>To identify you and provide security</li> <li>To identify you and provide security</li>
<li>To provide a satisfying user experience.</li> <li>To provide a satisfying user experience.</li>
</ol> </ol>
<h4><u>Preferences</u></h4> <h4><u>Preferences</u></h4>
<p>Entgra IoT Server 3.5.0 uses cookies to remember your settings and preferences and to auto-fill the <p>Entgra IoT Server 3.6.0 uses cookies to remember your settings and preferences and to auto-fill the
fields to make your interactions with the site easier.</p> fields to make your interactions with the site easier.</p>
<p>These cookies can not be used to personally identify you.</p> <p>These cookies can not be used to personally identify you.</p>
<h4><u>Security</u></h4> <h4><u>Security</u></h4>
<ol> <ol>
<li>Entgra IoT Server 3.5.0 uses selected cookies to identify and prevent security risks. For example, <li>Entgra IoT Server 3.6.0 uses selected cookies to identify and prevent security risks. For example,
Entgra IoT Server 3.5.0 may use cookies to store your session information to prevent others from Entgra IoT Server 3.6.0 may use cookies to store your session information to prevent others from
changing your password without your username and password. changing your password without your username and password.
</li> </li>
<li>Entgra IoT Server 3.5.0 uses session cookie to maintain your active session.</li> <li>Entgra IoT Server 3.6.0 uses session cookie to maintain your active session.</li>
<li>Entgra IoT Server 3.5.0 may use a temporary cookie when performing multi-factor authentication and <li>Entgra IoT Server 3.6.0 may use a temporary cookie when performing multi-factor authentication and
federated authentication. federated authentication.
</li> </li>
<li>Entgra IoT Server 3.5.0 may use permanent cookies to detect the devices you have logged in <li>Entgra IoT Server 3.6.0 may use permanent cookies to detect the devices you have logged in
previously. This is to to calculate the <b>risk level</b> associated with your current login previously. This is to to calculate the <b>risk level</b> associated with your current login
attempt. Using these cookies protects you and your account from possible attacks. attempt. Using these cookies protects you and your account from possible attacks.
</li> </li>
</ol> </ol>
<h4><u>Performance</u></h4> <h4><u>Performance</u></h4>
<p>Entgra IoT Server 3.5.0 may use cookies to allow <b>Remember Me</b> functionalities.</p> <p>Entgra IoT Server 3.6.0 may use cookies to allow <b>Remember Me</b> functionalities.</p>
<h4><u>Analytics</u></h4> <h4><u>Analytics</u></h4>
<p>Entgra IoT Server 3.5.0 as a product does not use cookies for analytical purposes.</p> <p>Entgra IoT Server 3.6.0 as a product does not use cookies for analytical purposes.</p>
<h4><u>Third party cookies</u></h4> <h4><u>Third party cookies</u></h4>
<p>Using Entgra IoT Server 3.5.0 may cause third-party cookie to be set in your browser. Entgra IoT Server <p>Using Entgra IoT Server 3.6.0 may cause third-party cookie to be set in your browser. Entgra IoT Server
3.5.0 has no control over how any of them operate. The third-party cookies that maybe set 3.6.0 has no control over how any of them operate. The third-party cookies that maybe set
include:</p> include:</p>
<ol> <ol>
<li>Any social login sites. For example, third-party cookies may be set when Entgra IoT Server 3.5.0 <li>Any social login sites. For example, third-party cookies may be set when Entgra IoT Server 3.6.0
is configured to use “social” or “federated” login, and you opt to login with your “Social is configured to use “social” or “federated” login, and you opt to login with your “Social
Account”. Account”.
</li> </li>
@ -101,11 +101,11 @@
</ol> </ol>
<p>Entgra strongly advises you to refer the respective cookie policies of such sites carefully as Entgra has <p>Entgra strongly advises you to refer the respective cookie policies of such sites carefully as Entgra has
no knowledge or use on these cookies.</p> no knowledge or use on these cookies.</p>
<h3>What type of cookies does Entgra IoT Server 3.5.0 use?</h3> <h3>What type of cookies does Entgra IoT Server 3.6.0 use?</h3>
<p>Entgra IoT Server 3.5.0 uses persistent cookies and session cookies. A persistent cookie helps Entgra IS <p>Entgra IoT Server 3.6.0 uses persistent cookies and session cookies. A persistent cookie helps Entgra IS
3.5.0 to recognize you as an existing user so that it is easier to return to Entgra or interact with 3.6.0 to recognize you as an existing user so that it is easier to return to Entgra or interact with
Entgra IS 3.5.0 without signing in again. After you sign in, a persistent cookie stays in your browser Entgra IS 3.6.0 without signing in again. After you sign in, a persistent cookie stays in your browser
and will be read by Entgra IoT Server 3.5.0 when you return to Entgra IoT Server 3.5.0.</p> and will be read by Entgra IoT Server 3.6.0 when you return to Entgra IoT Server 3.6.0.</p>
<p>A session cookie is a cookie that is erased when the user closes the Web browser. The session cookie <p>A session cookie is a cookie that is erased when the user closes the Web browser. The session cookie
is stored in temporarily and is not retained after the browser is closed. Session cookies do not is stored in temporarily and is not retained after the browser is closed. Session cookies do not
collect information from the users computer.</p> collect information from the users computer.</p>
@ -114,9 +114,9 @@
for websites to set cookies, you may worsen your overall user experience since it will no longer be for websites to set cookies, you may worsen your overall user experience since it will no longer be
personalized to you. It may also stop you from saving customized settings like login information. personalized to you. It may also stop you from saving customized settings like login information.
Most likely, disabling cookies will make it unable for you to use authentication and authorization Most likely, disabling cookies will make it unable for you to use authentication and authorization
functionalities offered by Entgra IoT Server 3.5.0.</p> functionalities offered by Entgra IoT Server 3.6.0.</p>
<p>If you have any questions or concerns regarding the use of cookies, please contact the entity or <p>If you have any questions or concerns regarding the use of cookies, please contact the entity or
individuals (or their data protection officer, if applicable) running this Entgra IoT Server 3.5.0 individuals (or their data protection officer, if applicable) running this Entgra IoT Server 3.6.0
instance.</p> instance.</p>
<h3>What are the cookies used?</h3> <h3>What are the cookies used?</h3>
<table class="table table-striped table-bordered"> <table class="table table-striped table-bordered">
@ -150,17 +150,17 @@
</tbody> </tbody>
</table> </table>
<h3>Disclaimer</h3> <h3>Disclaimer</h3>
<p>This cookie policy is only for illustrative purposes of the product Entgra IoT Server 3.5.0. The <p>This cookie policy is only for illustrative purposes of the product Entgra IoT Server 3.6.0. The
content in the policy is technically correct at the time of the product shipment. The content in the policy is technically correct at the time of the product shipment. The
entity,organization or individual that runs this Entgra IoT Server 3.5.0 instance has full authority entity,organization or individual that runs this Entgra IoT Server 3.6.0 instance has full authority
and responsibility with regard to the effective Cookie Policy. Entgra, its employees, partners, and and responsibility with regard to the effective Cookie Policy. Entgra, its employees, partners, and
affiliates do not have access to and do not require, store, process or control any of the data, affiliates do not have access to and do not require, store, process or control any of the data,
including personal data contained in Entgra IoT Server 3.5.0. All data, including personal data is including personal data contained in Entgra IoT Server 3.6.0. All data, including personal data is
controlled and processed by the entity, organization or individual running Entgra IoT Server 3.5.0. controlled and processed by the entity, organization or individual running Entgra IoT Server 3.6.0.
Entgra, its employees partners and affiliates are not a data processor or a data controller within the Entgra, its employees partners and affiliates are not a data processor or a data controller within the
meaning of any data privacy regulations. Entgra does not provide any warranties or undertake any meaning of any data privacy regulations. Entgra does not provide any warranties or undertake any
responsibility or liability in connection with the lawfulness or the manner and purposes for which responsibility or liability in connection with the lawfulness or the manner and purposes for which
Entgra IoT Server 3.5.0 is used by such entities, organizations or persons.</p> Entgra IoT Server 3.6.0 is used by such entities, organizations or persons.</p>
</div> </div>
</div> </div>
</div> </div>

@ -36,18 +36,18 @@
<p>Entgra IoT Server comes with advanced analytics, enabling users to analyze speed, proximity, and <p>Entgra IoT Server comes with advanced analytics, enabling users to analyze speed, proximity, and
geo-fencing information of devices including details of those in motion and stationary state.</p> geo-fencing information of devices including details of those in motion and stationary state.</p>
<h3>Privacy Policy</h3> <h3>Privacy Policy</h3>
<p>This policy describes how Entgra IoT Server 3.5.0 captures your personal information, the purposes of <p>This policy describes how Entgra IoT Server 3.6.0 captures your personal information, the purposes of
collection, and information about the retention of your personal information. collection, and information about the retention of your personal information.
<p>Please note that this policy is for reference only, and is applicable for the software as a product. <p>Please note that this policy is for reference only, and is applicable for the software as a product.
Entgra and its developers have no access to the information held within Entgra IoT Server Entgra and its developers have no access to the information held within Entgra IoT Server
3.5.0.Please see the Disclaimer section for more information. Entities, organisations or individuals 3.6.0.Please see the Disclaimer section for more information. Entities, organisations or individuals
controlling the use and administration of Entgra IoT Server 3.5.0 should create their own privacy controlling the use and administration of Entgra IoT Server 3.6.0 should create their own privacy
policies setting out the manner in which data is controlled or processed by the respective entity, policies setting out the manner in which data is controlled or processed by the respective entity,
organisation or individual. organisation or individual.
<h3>What is personal information?</h3> <h3>What is personal information?</h3>
<p>Entgra IoT Server 3.5.0 considers anything related to you and by which you may be identified as your <p>Entgra IoT Server 3.6.0 considers anything related to you and by which you may be identified as your
personal information.</p> personal information.</p>
<p><b>Signing in to Entgra IoT Server 3.5.0</b></p> <p><b>Signing in to Entgra IoT Server 3.6.0</b></p>
<ol> <ol>
<li>Your user name (except in cases where the user name created by your employer is under <li>Your user name (except in cases where the user name created by your employer is under
contract) contract)
@ -55,7 +55,7 @@
<li>IP address used to log in</li> <li>IP address used to log in</li>
<li>Email address</li> <li>Email address</li>
</ol> </ol>
<p><b>Enrolling a device with Entgra IoT Server 3.5.0</b></p> <p><b>Enrolling a device with Entgra IoT Server 3.6.0</b></p>
<ul> <ul>
<li>Your device ID (e.g., phone or tablet), mobile number, IMEI number, and IMSI number</li> <li>Your device ID (e.g., phone or tablet), mobile number, IMEI number, and IMSI number</li>
<li>Your devices location</li> <li>Your devices location</li>
@ -64,7 +64,7 @@
memory usage memory usage
</li> </li>
</ul> </ul>
<p>However, Entgra IoT Server 3.5.0 also collects the following information that is not considered <p>However, Entgra IoT Server 3.6.0 also collects the following information that is not considered
personal information, but is used only for <b>statistical</b> purposes. The reason for this is that personal information, but is used only for <b>statistical</b> purposes. The reason for this is that
this information can not be used to track you. this information can not be used to track you.
<ul> <ul>
@ -74,17 +74,17 @@
<li>Operating system and generic browser information</li> <li>Operating system and generic browser information</li>
</ul> </ul>
<h3>Collection of personal information</h3> <h3>Collection of personal information</h3>
<p>Entgra IoT Server 3.5.0 collects your information only to serve your access requirements. For example: <p>Entgra IoT Server 3.6.0 collects your information only to serve your access requirements. For example:
<ul> <ul>
<li>Entgra IoT Server 3.5.0 uses your IP address to detect any suspicious login attempts to your <li>Entgra IoT Server 3.6.0 uses your IP address to detect any suspicious login attempts to your
account. account.
<li>Entgra IoT Server 3.5.0 uses attributes like your first name, last name, etc., to provide a rich <li>Entgra IoT Server 3.6.0 uses attributes like your first name, last name, etc., to provide a rich
and personalized user experience. and personalized user experience.
<li>Entgra IoT Server 3.5.0 uses your security questions and answers only to allow account recovery. <li>Entgra IoT Server 3.6.0 uses your security questions and answers only to allow account recovery.
</li> </li>
</ul> </ul>
<h4><u>Tracking Technologies</u></h4> <h4><u>Tracking Technologies</u></h4>
<p>Entgra IoT Server 3.5.0 collects your information by:</p> <p>Entgra IoT Server 3.6.0 collects your information by:</p>
<ul> <ul>
<li>Collecting information from the user profile page where you enter your personal data.</li> <li>Collecting information from the user profile page where you enter your personal data.</li>
<li>Tracking your IP address with HTTP request, HTTP headers, and TCP/IP.</li> <li>Tracking your IP address with HTTP request, HTTP headers, and TCP/IP.</li>
@ -95,15 +95,15 @@
</li> </li>
</ul> </ul>
<h3>Use of personal information</h3> <h3>Use of personal information</h3>
<p>Entgra IoT Server 3.5.0 will only use your personal information for the purposes for which it was <p>Entgra IoT Server 3.6.0 will only use your personal information for the purposes for which it was
collected (or for a use identified as consistent with that purpose).</p> collected (or for a use identified as consistent with that purpose).</p>
<p>Entgra IoT Server 3.5.0 uses your personal information only for the following purposes.</p> <p>Entgra IoT Server 3.6.0 uses your personal information only for the following purposes.</p>
<ul> <ul>
<li>To provide you with a personalized user experience. Entgra IoT Server 3.5.0 uses your name and <li>To provide you with a personalized user experience. Entgra IoT Server 3.6.0 uses your name and
uploaded profile pictures for this purpose. uploaded profile pictures for this purpose.
</li> </li>
<li>To protect your account from unauthorized access or potential hacking attempts. Entgra IoT Server <li>To protect your account from unauthorized access or potential hacking attempts. Entgra IoT Server
3.5.0 uses HTTP or TCP/IP Headers for this purpose. 3.6.0 uses HTTP or TCP/IP Headers for this purpose.
</li> </li>
<li> <li>
<p>This includes:</p> <p>This includes:</p>
@ -114,10 +114,10 @@
</ol> </ol>
</li> </li>
<li>Derive statistical data for analytical purposes on system performance improvements. Entgra IoT <li>Derive statistical data for analytical purposes on system performance improvements. Entgra IoT
Server 3.5.0 will not keep any personal information after statistical calculations. Therefore, Server 3.6.0 will not keep any personal information after statistical calculations. Therefore,
the statistical report has no means of identifying an individual person. the statistical report has no means of identifying an individual person.
</li> </li>
<li>Entgra IoT Server 3.5.0 may use:</li> <li>Entgra IoT Server 3.6.0 may use:</li>
<li> <li>
<ol> <ol>
<li>IP Address to derive geographic information</li> <li>IP Address to derive geographic information</li>
@ -126,28 +126,28 @@
</li> </li>
</ul> </ul>
<h3>Disclosure of personal information</h3> <h3>Disclosure of personal information</h3>
<p>Entgra IoT Server 3.5.0 only discloses personal information to the relevant applications (also known as <p>Entgra IoT Server 3.6.0 only discloses personal information to the relevant applications (also known as
“Service Providers”) that are registered with Entgra IoT Server 3.5.0. These applications are “Service Providers”) that are registered with Entgra IoT Server 3.6.0. These applications are
registered by the identity administrator of your entity or organization. Personal information is registered by the identity administrator of your entity or organization. Personal information is
disclosed only for the purposes for which it was collected (or for a use identified as consistent disclosed only for the purposes for which it was collected (or for a use identified as consistent
with that purpose) as controlled by such Service Providers, unless you have consented otherwise or with that purpose) as controlled by such Service Providers, unless you have consented otherwise or
where it is required by law.</p> where it is required by law.</p>
<h4>Legal process</h4> <h4>Legal process</h4>
<p>Please note that the organisation, entity or individual running Entgra IoT Server 3.5.0 may be <p>Please note that the organisation, entity or individual running Entgra IoT Server 3.6.0 may be
compelled to disclose your personal information with or without your consent when it is required by compelled to disclose your personal information with or without your consent when it is required by
law following due and lawful process.</p> law following due and lawful process.</p>
<h3>Storage of personal information</h3> <h3>Storage of personal information</h3>
<h4><u>Where your personal information is stored</u></h4> <h4><u>Where your personal information is stored</u></h4>
<p>Entgra IoT Server 3.5.0 stores your personal information in secured databases. Entgra IoT Server 3.5.0 <p>Entgra IoT Server 3.6.0 stores your personal information in secured databases. Entgra IoT Server 3.6.0
exercises proper industry accepted security measures to protect the database where your personal exercises proper industry accepted security measures to protect the database where your personal
information is held.Entgra IoT Server 3.5.0 as a product does not transfer or share your data with any information is held.Entgra IoT Server 3.6.0 as a product does not transfer or share your data with any
third parties or locations.</p> third parties or locations.</p>
<p>Entgra IoT Server 3.5.0 may use encryption to keep your personal data with an added level of <p>Entgra IoT Server 3.6.0 may use encryption to keep your personal data with an added level of
security.</p> security.</p>
<h4><u>How long your personal information is retained</u></h4> <h4><u>How long your personal information is retained</u></h4>
<p>Entgra IoT Server 3.5.0 retains your personal data as long as you are an active user of our system. You <p>Entgra IoT Server 3.6.0 retains your personal data as long as you are an active user of our system. You
can update your personal data at any time using the given self-care user portals.</p> can update your personal data at any time using the given self-care user portals.</p>
<p>Entgra IoT Server 3.5.0 may keep hashed secrets to provide you with an added level of security. This <p>Entgra IoT Server 3.6.0 may keep hashed secrets to provide you with an added level of security. This
includes:</p> includes:</p>
<ul> <ul>
<li>Current password</li> <li>Current password</li>
@ -157,15 +157,15 @@
<p>You can request the administrator to delete your account. The administrator is the administrator of <p>You can request the administrator to delete your account. The administrator is the administrator of
the tenant you are registered under, or the super-administrator if you do not use the tenant the tenant you are registered under, or the super-administrator if you do not use the tenant
feature.</p> feature.</p>
<p>Additionally, you can request to anonymize all traces of your activities that Entgra IoT Server 3.5.0 <p>Additionally, you can request to anonymize all traces of your activities that Entgra IoT Server 3.6.0
may have retained in logs, databases or analytical storage.</p> may have retained in logs, databases or analytical storage.</p>
<h3>More information</h3> <h3>More information</h3>
<h4><u>Changes to this policy</u></h4> <h4><u>Changes to this policy</u></h4>
<p>Upgraded versions of Entgra IoT Server 3.5.0 may contain changes to this policy. Revisions to this <p>Upgraded versions of Entgra IoT Server 3.6.0 may contain changes to this policy. Revisions to this
policy will be packaged within such upgrades and would only apply to users who choose to use upgraded policy will be packaged within such upgrades and would only apply to users who choose to use upgraded
versions.</p> versions.</p>
<h4><u>Your choices</u></h4> <h4><u>Your choices</u></h4>
<p>If you are already have an user account within Entgra IoT Server 3.5.0 ; you have the right to <p>If you are already have an user account within Entgra IoT Server 3.6.0 ; you have the right to
deactivate your account if you find that this privacy policy is unacceptable to you.</p> deactivate your account if you find that this privacy policy is unacceptable to you.</p>
<p>If you do not have an account and you do not agree with our privacy policy, you can chose not to <p>If you do not have an account and you do not agree with our privacy policy, you can chose not to
create one.</p> create one.</p>
@ -174,19 +174,19 @@
<p><a href="https://entgra.io/contact/">https://entgra.io.com/contact/</a></p> <p><a href="https://entgra.io/contact/">https://entgra.io.com/contact/</a></p>
<h3>Disclaimer</h3> <h3>Disclaimer</h3>
<p>Entgra, its employees, partners, and affiliates do not have access to and do not require, store, <p>Entgra, its employees, partners, and affiliates do not have access to and do not require, store,
process or control any of the data, including personal data contained in Entgra IoT Server 3.5.0. All process or control any of the data, including personal data contained in Entgra IoT Server 3.6.0. All
data, including personal data is controlled and processed by the entity or individual running Entgra data, including personal data is controlled and processed by the entity or individual running Entgra
IoT Server 3.5.0. Entgra, its employees partners and affiliates are not a data processor or a data IoT Server 3.6.0. Entgra, its employees partners and affiliates are not a data processor or a data
controller within the meaning of any data privacy regulations. Entgra does not provide any warranties controller within the meaning of any data privacy regulations. Entgra does not provide any warranties
or undertake any responsibility or liability in connection with the lawfulness or the manner and or undertake any responsibility or liability in connection with the lawfulness or the manner and
purposes for which Entgra IoT Server 3.5.0 is used by such entities or persons.</p> purposes for which Entgra IoT Server 3.6.0 is used by such entities or persons.</p>
<p>This privacy policy is for the informational purposes of the entity or persons running Entgra IoT <p>This privacy policy is for the informational purposes of the entity or persons running Entgra IoT
Server 3.5.0 and sets out the processes and functionality contained within Entgra IoT Server 3.5.0 Server 3.6.0 and sets out the processes and functionality contained within Entgra IoT Server 3.6.0
regarding personal data protection. It is the responsibility of entities and persons running Entgra IoT regarding personal data protection. It is the responsibility of entities and persons running Entgra IoT
Server 3.5.0 to create and administer its own rules and processes governing users personal data, Server 3.6.0 to create and administer its own rules and processes governing users personal data,
Please note that the creation of such rules and processes may change the use, storage and disclosure Please note that the creation of such rules and processes may change the use, storage and disclosure
policies contained herein. Therefore users should consult the entity or persons running Entgra IoT policies contained herein. Therefore users should consult the entity or persons running Entgra IoT
Server 3.5.0 for its own privacy policy for details governing users personal data.</p> Server 3.6.0 for its own privacy policy for details governing users personal data.</p>
</div> </div>
</div> </div>
</div> </div>

@ -17,8 +17,8 @@
}} }}
{{#zone "footer"}} {{#zone "footer"}}
<p> <p>
<span class="hidden-xs">Entgra IoT Server{{#unless isCloud}} 3.5.0{{/unless}}</span> <span class="hidden-xs">Entgra IoT Server{{#unless isCloud}} 3.6.0{{/unless}}</span>
<span class="visible-xs-inline">Entgra IoT Server{{#unless isCloud}} 3.5.0{{/unless}}</span> | &copy; <script>document.write(new Date().getFullYear());</script>, <span class="visible-xs-inline">Entgra IoT Server{{#unless isCloud}} 3.6.0{{/unless}}</span> | &copy; <script>document.write(new Date().getFullYear());</script>,
<a href="https://www.entgra.io/" target="_blank">Entgra</a>. All Rights Reserved. <a href="https://www.entgra.io/" target="_blank">Entgra</a>. All Rights Reserved.
</p> </p>
{{/zone}} {{/zone}}

@ -17,8 +17,8 @@
}} }}
{{#zone "footer"}} {{#zone "footer"}}
<p> <p>
<span class="hidden-xs">Entgra IoT Server 3.5.0</span> <span class="hidden-xs">Entgra IoT Server 3.6.0</span>
<span class="visible-xs-inline">Entgra IoT Server 3.5.0</span> | © <script>document.write(new Date().getFullYear());</script>, <span class="visible-xs-inline">Entgra IoT Server 3.6.0</span> | © <script>document.write(new Date().getFullYear());</script>,
<a href="http://wso2.com/" target="_blank"><i class="icon fw fw-wso2"></i> Inc</a>. All Rights Reserved. <a href="http://wso2.com/" target="_blank"><i class="icon fw fw-wso2"></i> Inc</a>. All Rights Reserved.
</p> </p>
{{/zone}} {{/zone}}

@ -23,7 +23,7 @@
<parent> <parent>
<artifactId>device-mgt</artifactId> <artifactId>device-mgt</artifactId>
<groupId>org.wso2.carbon.devicemgt</groupId> <groupId>org.wso2.carbon.devicemgt</groupId>
<version>3.2.7-SNAPSHOT</version> <version>3.2.9-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath> <relativePath>../pom.xml</relativePath>
</parent> </parent>

@ -22,7 +22,7 @@
<parent> <parent>
<groupId>org.wso2.carbon.devicemgt</groupId> <groupId>org.wso2.carbon.devicemgt</groupId>
<artifactId>carbon-devicemgt</artifactId> <artifactId>carbon-devicemgt</artifactId>
<version>3.2.7-SNAPSHOT</version> <version>3.2.9-SNAPSHOT</version>
<relativePath>../../pom.xml</relativePath> <relativePath>../../pom.xml</relativePath>
</parent> </parent>

@ -22,7 +22,7 @@
<parent> <parent>
<groupId>org.wso2.carbon.devicemgt</groupId> <groupId>org.wso2.carbon.devicemgt</groupId>
<artifactId>email-sender</artifactId> <artifactId>email-sender</artifactId>
<version>3.2.7-SNAPSHOT</version> <version>3.2.9-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath> <relativePath>../pom.xml</relativePath>
</parent> </parent>

@ -22,7 +22,7 @@
<parent> <parent>
<groupId>org.wso2.carbon.devicemgt</groupId> <groupId>org.wso2.carbon.devicemgt</groupId>
<artifactId>carbon-devicemgt</artifactId> <artifactId>carbon-devicemgt</artifactId>
<version>3.2.7-SNAPSHOT</version> <version>3.2.9-SNAPSHOT</version>
<relativePath>../../pom.xml</relativePath> <relativePath>../../pom.xml</relativePath>
</parent> </parent>

@ -22,13 +22,13 @@
<parent> <parent>
<groupId>org.wso2.carbon.devicemgt</groupId> <groupId>org.wso2.carbon.devicemgt</groupId>
<artifactId>identity-extensions</artifactId> <artifactId>identity-extensions</artifactId>
<version>3.2.7-SNAPSHOT</version> <version>3.2.9-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath> <relativePath>../pom.xml</relativePath>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<artifactId>org.wso2.carbon.device.mgt.oauth.extensions</artifactId> <artifactId>org.wso2.carbon.device.mgt.oauth.extensions</artifactId>
<version>3.2.7-SNAPSHOT</version> <version>3.2.9-SNAPSHOT</version>
<packaging>bundle</packaging> <packaging>bundle</packaging>
<name>WSO2 Carbon - OAuth Extensions</name> <name>WSO2 Carbon - OAuth Extensions</name>
<url>http://wso2.org</url> <url>http://wso2.org</url>

@ -21,7 +21,7 @@
<parent> <parent>
<artifactId>identity-extensions</artifactId> <artifactId>identity-extensions</artifactId>
<groupId>org.wso2.carbon.devicemgt</groupId> <groupId>org.wso2.carbon.devicemgt</groupId>
<version>3.2.7-SNAPSHOT</version> <version>3.2.9-SNAPSHOT</version>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>

@ -22,7 +22,7 @@
<parent> <parent>
<groupId>org.wso2.carbon.devicemgt</groupId> <groupId>org.wso2.carbon.devicemgt</groupId>
<artifactId>identity-extensions</artifactId> <artifactId>identity-extensions</artifactId>
<version>3.2.7-SNAPSHOT</version> <version>3.2.9-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath> <relativePath>../pom.xml</relativePath>
</parent> </parent>

@ -22,7 +22,7 @@
<parent> <parent>
<groupId>org.wso2.carbon.devicemgt</groupId> <groupId>org.wso2.carbon.devicemgt</groupId>
<artifactId>carbon-devicemgt</artifactId> <artifactId>carbon-devicemgt</artifactId>
<version>3.2.7-SNAPSHOT</version> <version>3.2.9-SNAPSHOT</version>
<relativePath>../../pom.xml</relativePath> <relativePath>../../pom.xml</relativePath>
</parent> </parent>

@ -22,14 +22,14 @@
<parent> <parent>
<groupId>org.wso2.carbon.devicemgt</groupId> <groupId>org.wso2.carbon.devicemgt</groupId>
<artifactId>policy-mgt</artifactId> <artifactId>policy-mgt</artifactId>
<version>3.2.7-SNAPSHOT</version> <version>3.2.9-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath> <relativePath>../pom.xml</relativePath>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<groupId>org.wso2.carbon.devicemgt</groupId> <groupId>org.wso2.carbon.devicemgt</groupId>
<artifactId>org.wso2.carbon.complex.policy.decision.point</artifactId> <artifactId>org.wso2.carbon.complex.policy.decision.point</artifactId>
<version>3.2.7-SNAPSHOT</version> <version>3.2.9-SNAPSHOT</version>
<packaging>bundle</packaging> <packaging>bundle</packaging>
<name>WSO2 Carbon - Policy Decision Point</name> <name>WSO2 Carbon - Policy Decision Point</name>
<description>WSO2 Carbon - Policy Decision Point</description> <description>WSO2 Carbon - Policy Decision Point</description>

@ -3,14 +3,14 @@
<parent> <parent>
<groupId>org.wso2.carbon.devicemgt</groupId> <groupId>org.wso2.carbon.devicemgt</groupId>
<artifactId>policy-mgt</artifactId> <artifactId>policy-mgt</artifactId>
<version>3.2.7-SNAPSHOT</version> <version>3.2.9-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath> <relativePath>../pom.xml</relativePath>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<groupId>org.wso2.carbon.devicemgt</groupId> <groupId>org.wso2.carbon.devicemgt</groupId>
<artifactId>org.wso2.carbon.policy.decision.point</artifactId> <artifactId>org.wso2.carbon.policy.decision.point</artifactId>
<version>3.2.7-SNAPSHOT</version> <version>3.2.9-SNAPSHOT</version>
<packaging>bundle</packaging> <packaging>bundle</packaging>
<name>WSO2 Carbon - Policy Decision Point</name> <name>WSO2 Carbon - Policy Decision Point</name>
<description>WSO2 Carbon - Policy Decision Point</description> <description>WSO2 Carbon - Policy Decision Point</description>

@ -43,9 +43,11 @@ public class PolicyEvaluationServiceImpl implements PolicyEvaluationPoint {
@Override @Override
public List<ProfileFeature> getEffectiveFeatures(DeviceIdentifier deviceIdentifier) public List<ProfileFeature> getEffectiveFeatures(DeviceIdentifier deviceIdentifier)
throws PolicyEvaluationException { throws PolicyEvaluationException {
List<ProfileFeature> effectiveFeatures = null;
List<ProfileFeature> effectiveFeatures = evaluation.getEffectivePolicy(deviceIdentifier). Policy effectivePolicy = evaluation.getEffectivePolicy(deviceIdentifier);
getProfile().getProfileFeaturesList(); if (effectivePolicy != null) {
effectiveFeatures = effectivePolicy.getProfile().getProfileFeaturesList();
}
return effectiveFeatures; return effectiveFeatures;
} }

@ -3,7 +3,7 @@
<parent> <parent>
<groupId>org.wso2.carbon.devicemgt</groupId> <groupId>org.wso2.carbon.devicemgt</groupId>
<artifactId>policy-mgt</artifactId> <artifactId>policy-mgt</artifactId>
<version>3.2.7-SNAPSHOT</version> <version>3.2.9-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath> <relativePath>../pom.xml</relativePath>
</parent> </parent>
@ -11,7 +11,7 @@
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<groupId>org.wso2.carbon.devicemgt</groupId> <groupId>org.wso2.carbon.devicemgt</groupId>
<artifactId>org.wso2.carbon.policy.information.point</artifactId> <artifactId>org.wso2.carbon.policy.information.point</artifactId>
<version>3.2.7-SNAPSHOT</version> <version>3.2.9-SNAPSHOT</version>
<packaging>bundle</packaging> <packaging>bundle</packaging>
<name>WSO2 Carbon - Policy Information Point</name> <name>WSO2 Carbon - Policy Information Point</name>
<description>WSO2 Carbon - Policy Information Point</description> <description>WSO2 Carbon - Policy Information Point</description>

@ -22,14 +22,14 @@
<parent> <parent>
<groupId>org.wso2.carbon.devicemgt</groupId> <groupId>org.wso2.carbon.devicemgt</groupId>
<artifactId>policy-mgt</artifactId> <artifactId>policy-mgt</artifactId>
<version>3.2.7-SNAPSHOT</version> <version>3.2.9-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath> <relativePath>../pom.xml</relativePath>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<groupId>org.wso2.carbon.devicemgt</groupId> <groupId>org.wso2.carbon.devicemgt</groupId>
<artifactId>org.wso2.carbon.policy.mgt.common</artifactId> <artifactId>org.wso2.carbon.policy.mgt.common</artifactId>
<version>3.2.7-SNAPSHOT</version> <version>3.2.9-SNAPSHOT</version>
<packaging>bundle</packaging> <packaging>bundle</packaging>
<name>WSO2 Carbon - Policy Management Common</name> <name>WSO2 Carbon - Policy Management Common</name>
<description>WSO2 Carbon - Policy Management Common</description> <description>WSO2 Carbon - Policy Management Common</description>

@ -22,14 +22,14 @@
<parent> <parent>
<groupId>org.wso2.carbon.devicemgt</groupId> <groupId>org.wso2.carbon.devicemgt</groupId>
<artifactId>policy-mgt</artifactId> <artifactId>policy-mgt</artifactId>
<version>3.2.7-SNAPSHOT</version> <version>3.2.9-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath> <relativePath>../pom.xml</relativePath>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<groupId>org.wso2.carbon.devicemgt</groupId> <groupId>org.wso2.carbon.devicemgt</groupId>
<artifactId>org.wso2.carbon.policy.mgt.core</artifactId> <artifactId>org.wso2.carbon.policy.mgt.core</artifactId>
<version>3.2.7-SNAPSHOT</version> <version>3.2.9-SNAPSHOT</version>
<packaging>bundle</packaging> <packaging>bundle</packaging>
<name>WSO2 Carbon - Policy Management Core</name> <name>WSO2 Carbon - Policy Management Core</name>
<description>WSO2 Carbon - Policy Management Core</description> <description>WSO2 Carbon - Policy Management Core</description>

@ -14,6 +14,23 @@
* KIND, either express or implied. See the License for the * KIND, either express or implied. See the License for the
* specific language governing permissions and limitations * specific language governing permissions and limitations
* under the License. * under the License.
*
*
* Copyright (c) 2019, Entgra (Pvt) Ltd. (http://entgra.io) All Rights Reserved.
*
* Entgra (Pvt) Ltd. licenses this file to you under the Apache License,
* Version 2.0 (the "License"); you may not use this file except
* in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/ */
package org.wso2.carbon.policy.mgt.core.mock; package org.wso2.carbon.policy.mgt.core.mock;
@ -61,6 +78,11 @@ public class TypeXDeviceManager implements DeviceManager {
return false; return false;
} }
@Override
public boolean deleteDevice(DeviceIdentifier deviceId, Device device) throws DeviceManagementException {
return false;
}
@Override @Override
public boolean isEnrolled(DeviceIdentifier deviceId) throws DeviceManagementException { public boolean isEnrolled(DeviceIdentifier deviceId) throws DeviceManagementException {
return false; return false;

@ -23,13 +23,13 @@
<parent> <parent>
<groupId>org.wso2.carbon.devicemgt</groupId> <groupId>org.wso2.carbon.devicemgt</groupId>
<artifactId>carbon-devicemgt</artifactId> <artifactId>carbon-devicemgt</artifactId>
<version>3.2.7-SNAPSHOT</version> <version>3.2.9-SNAPSHOT</version>
<relativePath>../../pom.xml</relativePath> <relativePath>../../pom.xml</relativePath>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<artifactId>policy-mgt</artifactId> <artifactId>policy-mgt</artifactId>
<version>3.2.7-SNAPSHOT</version> <version>3.2.9-SNAPSHOT</version>
<packaging>pom</packaging> <packaging>pom</packaging>
<name>WSO2 Carbon - Policy Management Component</name> <name>WSO2 Carbon - Policy Management Component</name>
<url>http://wso2.org</url> <url>http://wso2.org</url>

@ -21,7 +21,7 @@
<parent> <parent>
<artifactId>carbon-devicemgt</artifactId> <artifactId>carbon-devicemgt</artifactId>
<groupId>org.wso2.carbon.devicemgt</groupId> <groupId>org.wso2.carbon.devicemgt</groupId>
<version>3.2.7-SNAPSHOT</version> <version>3.2.9-SNAPSHOT</version>
<relativePath>../../pom.xml</relativePath> <relativePath>../../pom.xml</relativePath>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>

@ -23,13 +23,13 @@
<parent> <parent>
<artifactId>ui-request-interceptor</artifactId> <artifactId>ui-request-interceptor</artifactId>
<groupId>io.entgra.devicemgt</groupId> <groupId>io.entgra.devicemgt</groupId>
<version>3.2.7-SNAPSHOT</version> <version>3.2.9-SNAPSHOT</version>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<artifactId>io.entgra.ui.request.interceptor</artifactId> <artifactId>io.entgra.ui.request.interceptor</artifactId>
<version>3.2.7-SNAPSHOT</version> <version>3.2.9-SNAPSHOT</version>
<packaging>war</packaging> <packaging>war</packaging>
<name>Entgra - Request Handling Proxy Servlet</name> <name>Entgra - Request Handling Proxy Servlet</name>
<description>Proxy Service for Request Handling in Entgra EMM/IOT Server.</description> <description>Proxy Service for Request Handling in Entgra EMM/IOT Server.</description>

@ -23,7 +23,7 @@
<parent> <parent>
<artifactId>carbon-devicemgt</artifactId> <artifactId>carbon-devicemgt</artifactId>
<groupId>org.wso2.carbon.devicemgt</groupId> <groupId>org.wso2.carbon.devicemgt</groupId>
<version>3.2.7-SNAPSHOT</version> <version>3.2.9-SNAPSHOT</version>
<relativePath>../../pom.xml</relativePath> <relativePath>../../pom.xml</relativePath>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>

@ -21,14 +21,14 @@
<parent> <parent>
<groupId>org.wso2.carbon.devicemgt</groupId> <groupId>org.wso2.carbon.devicemgt</groupId>
<artifactId>webapp-authenticator-framework</artifactId> <artifactId>webapp-authenticator-framework</artifactId>
<version>3.2.7-SNAPSHOT</version> <version>3.2.9-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath> <relativePath>../pom.xml</relativePath>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<groupId>org.wso2.carbon.devicemgt</groupId> <groupId>org.wso2.carbon.devicemgt</groupId>
<artifactId>org.wso2.carbon.webapp.authenticator.framework</artifactId> <artifactId>org.wso2.carbon.webapp.authenticator.framework</artifactId>
<version>3.2.7-SNAPSHOT</version> <version>3.2.9-SNAPSHOT</version>
<packaging>bundle</packaging> <packaging>bundle</packaging>
<name>WSO2 Carbon - Web Application Authenticator Framework Bundle</name> <name>WSO2 Carbon - Web Application Authenticator Framework Bundle</name>
<description>WSO2 Carbon - Web Application Authenticator Framework Bundle</description> <description>WSO2 Carbon - Web Application Authenticator Framework Bundle</description>

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save