Merge branch 'appm-dao' into 'master'

Fix issues in GET /applications API 

Closes product-iots#470 and product-iots#469

See merge request entgra/carbon-device-mgt!502
4.x.x
Dharmakeerthi Lasantha 5 years ago
commit 93c0c7e111

@ -21,6 +21,7 @@ import java.util.List;
/** /**
* Filter represents a criteria that can be used for searching applications. * Filter represents a criteria that can be used for searching applications.
* The default value for limit is 20
*/ */
public class Filter { public class Filter {
@ -87,8 +88,9 @@ public class Filter {
/** /**
* Limit of the applications * Limit of the applications
* default: 20
*/ */
private int limit; private int limit = 20;
/** /**
* Started from * Started from

@ -94,7 +94,13 @@ public class GenericApplicationDAOImpl extends AbstractDAOImpl implements Applic
} }
@Override @Override
public List<ApplicationDTO> getApplications(Filter filter,int deviceTypeId, int tenantId) throws ApplicationManagementDAOException { public List<ApplicationDTO> getApplications(Filter filter, int deviceTypeId, int tenantId) throws
ApplicationManagementDAOException {
if (filter == null) {
String msg = "Filter is not instantiated for tenant "+tenantId;
log.error(msg);
throw new ApplicationManagementDAOException(msg);
}
if (log.isDebugEnabled()) { if (log.isDebugEnabled()) {
log.debug("Getting application data from the database"); log.debug("Getting application data from the database");
log.debug(String.format("Filter: limit=%s, offset=%s", filter.getLimit(), filter.getOffset())); log.debug(String.format("Filter: limit=%s, offset=%s", filter.getLimit(), filter.getOffset()));
@ -131,74 +137,60 @@ public class GenericApplicationDAOImpl extends AbstractDAOImpl implements Applic
+ "FROM AP_APP " + "FROM AP_APP "
+ "INNER JOIN AP_APP_RELEASE ON " + "INNER JOIN AP_APP_RELEASE ON "
+ "AP_APP.ID = AP_APP_RELEASE.AP_APP_ID " + "AP_APP.ID = AP_APP_RELEASE.AP_APP_ID "
+ "INNER JOIN (SELECT ID FROM AP_APP WHERE AP_APP.TENANT_ID = ? LIMIT ? OFFSET ? ) AS app_data ON app_data.ID = AP_APP.ID " + "INNER JOIN (SELECT AP_APP.ID FROM AP_APP ";
+ "WHERE AP_APP.TENANT_ID = ?"; if (!StringUtils.isEmpty(filter.getVersion()) || !StringUtils.isEmpty(filter.getAppReleaseState())
|| !StringUtils.isEmpty(filter.getAppReleaseType())) {
if (filter == null) { sql += "INNER JOIN AP_APP_RELEASE ON AP_APP.ID = AP_APP_RELEASE.AP_APP_ID ";
String msg = "Filter is not instantiated.";
log.error(msg);
throw new ApplicationManagementDAOException(msg);
} }
sql += "WHERE AP_APP.TENANT_ID = ? ";
if (!StringUtils.isEmpty(filter.getAppType())) { if (!StringUtils.isEmpty(filter.getAppType())) {
sql += " AND AP_APP.TYPE = ?"; sql += "AND AP_APP.TYPE = ? ";
} }
if (!StringUtils.isEmpty(filter.getAppName())) { if (!StringUtils.isEmpty(filter.getAppName())) {
sql += " AND LOWER (AP_APP.NAME) "; sql += " AND LOWER (AP_APP.NAME) ";
if (filter.isFullMatch()) { if (filter.isFullMatch()) {
sql += "= ?"; sql += "= ? ";
} else { } else {
sql += "LIKE ?"; sql += "LIKE ? ";
} }
} }
if (!StringUtils.isEmpty(filter.getSubscriptionType())) { if (!StringUtils.isEmpty(filter.getSubscriptionType())) {
sql += " AND AP_APP.SUB_TYPE = ?"; sql += "AND AP_APP.SUB_TYPE = ? ";
} }
if (filter.getMinimumRating() > 0) { if (filter.getMinimumRating() > 0) {
sql += " AND AP_APP.RATING >= ?"; sql += "AND AP_APP.RATING >= ? ";
} }
if (!StringUtils.isEmpty(filter.getVersion())) { if (!StringUtils.isEmpty(filter.getVersion())) {
sql += " AND AP_APP_RELEASE.VERSION = ?"; sql += "AND AP_APP_RELEASE.VERSION = ? ";
} }
if (!StringUtils.isEmpty(filter.getAppReleaseType())) { if (!StringUtils.isEmpty(filter.getAppReleaseType())) {
sql += " AND AP_APP_RELEASE.RELEASE_TYPE = ?"; sql += "AND AP_APP_RELEASE.RELEASE_TYPE = ? ";
} }
if (!StringUtils.isEmpty(filter.getAppReleaseState())) { if (!StringUtils.isEmpty(filter.getAppReleaseState())) {
sql += " AND AP_APP_RELEASE.CURRENT_STATE = ?"; sql += "AND AP_APP_RELEASE.CURRENT_STATE = ? ";
} }
if (deviceTypeId != -1) { if (deviceTypeId != -1) {
sql += " AND AP_APP.DEVICE_TYPE_ID = ?"; sql += "AND AP_APP.DEVICE_TYPE_ID = ? ";
} }
sql += "GROUP BY AP_APP.ID ";
if (filter.getLimit() == -1) { if (!StringUtils.isEmpty(filter.getSortBy())) {
sql = sql.replace("LIMIT ? OFFSET ?", ""); sql += "ORDER BY ID " + filter.getSortBy() +" ";
} }
if (filter.getLimit() != -1) {
String sortingOrder = "ASC"; sql += " LIMIT ? OFFSET ? ";
if (!StringUtils.isEmpty(filter.getSortBy() )) {
sortingOrder = filter.getSortBy();
} }
sql += " ORDER BY APP_ID " + sortingOrder; sql += ") AS app_data ON app_data.ID = AP_APP.ID " +
"WHERE AP_APP.TENANT_ID = ?";
try { try {
Connection conn = this.getDBConnection(); Connection conn = this.getDBConnection();
try (PreparedStatement stmt = conn.prepareStatement(sql)){ try (PreparedStatement stmt = conn.prepareStatement(sql)) {
int paramIndex = 1; int paramIndex = 1;
stmt.setInt(paramIndex++, tenantId); stmt.setInt(paramIndex++, tenantId);
if (filter.getLimit() != -1) { if (!StringUtils.isEmpty(filter.getAppType())) {
if (filter.getLimit() == 0) {
stmt.setInt(paramIndex++, 100);
} else {
stmt.setInt(paramIndex++, filter.getLimit());
}
stmt.setInt(paramIndex++, filter.getOffset());
}
stmt.setInt(paramIndex++, tenantId);
if (filter.getAppType() != null && !filter.getAppType().isEmpty()) {
stmt.setString(paramIndex++, filter.getAppType()); stmt.setString(paramIndex++, filter.getAppType());
} }
if (filter.getAppName() != null && !filter.getAppName().isEmpty()) { if (!StringUtils.isEmpty(filter.getAppName())) {
if (filter.isFullMatch()) { if (filter.isFullMatch()) {
stmt.setString(paramIndex++, filter.getAppName().toLowerCase()); stmt.setString(paramIndex++, filter.getAppName().toLowerCase());
} else { } else {
@ -220,10 +212,15 @@ public class GenericApplicationDAOImpl extends AbstractDAOImpl implements Applic
if (!StringUtils.isEmpty(filter.getAppReleaseState())) { if (!StringUtils.isEmpty(filter.getAppReleaseState())) {
stmt.setString(paramIndex++, filter.getAppReleaseState()); stmt.setString(paramIndex++, filter.getAppReleaseState());
} }
if (deviceTypeId > 0 ) { if (deviceTypeId > 0) {
stmt.setInt(paramIndex, deviceTypeId); stmt.setInt(paramIndex++, deviceTypeId);
} }
try (ResultSet rs = stmt.executeQuery() ) { if (filter.getLimit() != -1) {
stmt.setInt(paramIndex++, filter.getLimit());
stmt.setInt(paramIndex++, filter.getOffset());
}
stmt.setInt(paramIndex, tenantId);
try (ResultSet rs = stmt.executeQuery()) {
return DAOUtil.loadApplications(rs); return DAOUtil.loadApplications(rs);
} }
} }

@ -41,13 +41,17 @@ public class OracleApplicationDAOImpl extends GenericApplicationDAOImpl {
private static final Log log = LogFactory.getLog(OracleApplicationDAOImpl.class); private static final Log log = LogFactory.getLog(OracleApplicationDAOImpl.class);
@Override @Override
public List<ApplicationDTO> getApplications(Filter filter,int deviceTypeId, int tenantId) throws public List<ApplicationDTO> getApplications(Filter filter, int deviceTypeId, int tenantId) throws
ApplicationManagementDAOException { ApplicationManagementDAOException {
if (filter == null) {
String msg = "Filter is not instantiated for tenant " + tenantId;
log.error(msg);
throw new ApplicationManagementDAOException(msg);
}
if (log.isDebugEnabled()) { if (log.isDebugEnabled()) {
log.debug("Getting application data from the database"); log.debug("Getting application data from the database");
log.debug(String.format("Filter: limit=%s, offset=%s", filter.getLimit(), filter.getOffset())); log.debug(String.format("Filter: limit=%s, offset=%s", filter.getLimit(), filter.getOffset()));
} }
int paramIndex = 1;
String sql = "SELECT " String sql = "SELECT "
+ "AP_APP.ID AS APP_ID, " + "AP_APP.ID AS APP_ID, "
+ "AP_APP.NAME AS APP_NAME, " + "AP_APP.NAME AS APP_NAME, "
@ -80,73 +84,57 @@ public class OracleApplicationDAOImpl extends GenericApplicationDAOImpl {
+ "FROM AP_APP " + "FROM AP_APP "
+ "INNER JOIN AP_APP_RELEASE ON " + "INNER JOIN AP_APP_RELEASE ON "
+ "AP_APP.ID = AP_APP_RELEASE.AP_APP_ID " + "AP_APP.ID = AP_APP_RELEASE.AP_APP_ID "
+ "INNER JOIN (SELECT ID FROM AP_APP ORDER BY ID OFFSET ? ROWS FETCH NEXT ? ROWS ONLY) AS app_data ON app_data.ID = AP_APP.ID " + "INNER JOIN (SELECT AP_APP.ID FROM AP_APP ORDER BY ID ";
+ "WHERE AP_APP.TENANT_ID = ?"; if (!StringUtils.isEmpty(filter.getVersion()) || !StringUtils.isEmpty(filter.getAppReleaseState())
|| !StringUtils.isEmpty(filter.getAppReleaseType())) {
if (filter == null) { sql += "INNER JOIN AP_APP_RELEASE ON AP_APP.ID = AP_APP_RELEASE.AP_APP_ID ";
String msg = "Filter is not instantiated.";
log.error(msg);
throw new ApplicationManagementDAOException(msg);
} }
if (!StringUtils.isEmpty(filter.getAppType())) { if (!StringUtils.isEmpty(filter.getAppType())) {
sql += " AND AP_APP.TYPE = ?"; sql += "AND AP_APP.TYPE = ? ";
} }
if (!StringUtils.isEmpty(filter.getAppName())) { if (!StringUtils.isEmpty(filter.getAppName())) {
sql += " AND LOWER (AP_APP.NAME) "; sql += " AND LOWER (AP_APP.NAME) ";
if (filter.isFullMatch()) { if (filter.isFullMatch()) {
sql += "= ?"; sql += "= ? ";
} else { } else {
sql += "LIKE ?"; sql += "LIKE ? ";
} }
} }
if (!StringUtils.isEmpty(filter.getSubscriptionType())) { if (!StringUtils.isEmpty(filter.getSubscriptionType())) {
sql += " AND AP_APP.SUB_TYPE = ?"; sql += "AND AP_APP.SUB_TYPE = ? ";
} }
if (filter.getMinimumRating() > 0) { if (filter.getMinimumRating() > 0) {
sql += " AND AP_APP.RATING >= ?"; sql += "AND AP_APP.RATING >= ? ";
} }
if (!StringUtils.isEmpty(filter.getVersion())) { if (!StringUtils.isEmpty(filter.getVersion())) {
sql += " AND AP_APP_RELEASE.VERSION = ?"; sql += "AND AP_APP_RELEASE.VERSION = ? ";
} }
if (!StringUtils.isEmpty(filter.getAppReleaseType())) { if (!StringUtils.isEmpty(filter.getAppReleaseType())) {
sql += " AND AP_APP_RELEASE.RELEASE_TYPE = ?"; sql += "AND AP_APP_RELEASE.RELEASE_TYPE = ? ";
} }
if (!StringUtils.isEmpty(filter.getAppReleaseState())) { if (!StringUtils.isEmpty(filter.getAppReleaseState())) {
sql += " AND AP_APP_RELEASE.CURRENT_STATE = ?"; sql += "AND AP_APP_RELEASE.CURRENT_STATE = ? ";
} }
if (deviceTypeId != -1) { if (deviceTypeId != -1) {
sql += " AND AP_APP.DEVICE_TYPE_ID = ?"; sql += "AND AP_APP.DEVICE_TYPE_ID = ? ";
} }
sql += "GROUP BY AP_APP.ID ";
if (filter.getLimit() == -1) { if (!StringUtils.isEmpty(filter.getSortBy())) {
sql = sql.replace("OFFSET ? ROWS FETCH NEXT ? ROWS ONLY", ""); sql += "ORDER BY ID " + filter.getSortBy() + " ";
} }
if (filter.getLimit() != -1) {
String sortingOrder = "ASC"; sql += "OFFSET ? ROWS FETCH NEXT ? ROWS ONLY ";
if (!StringUtils.isEmpty(filter.getSortBy() )) {
sortingOrder = filter.getSortBy();
} }
sql += " ORDER BY APP_ID " + sortingOrder; sql += ") AS app_data ON app_data.ID = AP_APP.ID " +
"WHERE AP_APP.TENANT_ID = ?";
try { try {
Connection conn = this.getDBConnection(); Connection conn = this.getDBConnection();
try (PreparedStatement stmt = conn.prepareStatement(sql); try (PreparedStatement stmt = conn.prepareStatement(sql)) {
){ int paramIndex = 1;
if (filter.getLimit() != -1) { if (!StringUtils.isEmpty(filter.getAppType())) {
stmt.setInt(paramIndex++, filter.getOffset());
if (filter.getLimit() == 0) {
stmt.setInt(paramIndex++, 100);
} else {
stmt.setInt(paramIndex++, filter.getLimit());
}
}
stmt.setInt(paramIndex++, tenantId);
if (filter.getAppType() != null && !filter.getAppType().isEmpty()) {
stmt.setString(paramIndex++, filter.getAppType()); stmt.setString(paramIndex++, filter.getAppType());
} }
if (filter.getAppName() != null && !filter.getAppName().isEmpty()) { if (!StringUtils.isEmpty(filter.getAppName())) {
if (filter.isFullMatch()) { if (filter.isFullMatch()) {
stmt.setString(paramIndex++, filter.getAppName().toLowerCase()); stmt.setString(paramIndex++, filter.getAppName().toLowerCase());
} else { } else {
@ -168,10 +156,15 @@ public class OracleApplicationDAOImpl extends GenericApplicationDAOImpl {
if (!StringUtils.isEmpty(filter.getAppReleaseState())) { if (!StringUtils.isEmpty(filter.getAppReleaseState())) {
stmt.setString(paramIndex++, filter.getAppReleaseState()); stmt.setString(paramIndex++, filter.getAppReleaseState());
} }
if (deviceTypeId > 0 ) { if (deviceTypeId > 0) {
stmt.setInt(paramIndex, deviceTypeId); stmt.setInt(paramIndex++, deviceTypeId);
}
if (filter.getLimit() != -1) {
stmt.setInt(paramIndex++, filter.getOffset());
stmt.setInt(paramIndex++, filter.getLimit());
} }
try (ResultSet rs = stmt.executeQuery() ) { stmt.setInt(paramIndex, tenantId);
try (ResultSet rs = stmt.executeQuery()) {
return DAOUtil.loadApplications(rs); return DAOUtil.loadApplications(rs);
} }
} }

@ -40,13 +40,17 @@ public class SQLServerApplicationDAOImpl extends GenericApplicationDAOImpl {
private static final Log log = LogFactory.getLog(SQLServerApplicationDAOImpl.class); private static final Log log = LogFactory.getLog(SQLServerApplicationDAOImpl.class);
@Override @Override
public List<ApplicationDTO> getApplications(Filter filter,int deviceTypeId, int tenantId) throws public List<ApplicationDTO> getApplications(Filter filter, int deviceTypeId, int tenantId) throws
ApplicationManagementDAOException { ApplicationManagementDAOException {
if (filter == null) {
String msg = "Filter is not instantiated for tenant " + tenantId;
log.error(msg);
throw new ApplicationManagementDAOException(msg);
}
if (log.isDebugEnabled()) { if (log.isDebugEnabled()) {
log.debug("Getting application data from the database"); log.debug("Getting application data from the database");
log.debug(String.format("Filter: limit=%s, offset=%s", filter.getLimit(), filter.getOffset())); log.debug(String.format("Filter: limit=%s, offset=%s", filter.getLimit(), filter.getOffset()));
} }
int paramIndex = 1;
String sql = "SELECT " String sql = "SELECT "
+ "AP_APP.ID AS APP_ID, " + "AP_APP.ID AS APP_ID, "
+ "AP_APP.NAME AS APP_NAME, " + "AP_APP.NAME AS APP_NAME, "
@ -79,73 +83,57 @@ public class SQLServerApplicationDAOImpl extends GenericApplicationDAOImpl {
+ "FROM AP_APP " + "FROM AP_APP "
+ "INNER JOIN AP_APP_RELEASE ON " + "INNER JOIN AP_APP_RELEASE ON "
+ "AP_APP.ID = AP_APP_RELEASE.AP_APP_ID " + "AP_APP.ID = AP_APP_RELEASE.AP_APP_ID "
+ "INNER JOIN (SELECT ID FROM AP_APP ORDER BY ID OFFSET ? ROWS FETCH NEXT ? ROWS ONLY) AS app_data ON app_data.ID = AP_APP.ID " + "INNER JOIN (SELECT AP_APP.ID FROM AP_APP ";
+ "WHERE AP_APP.TENANT_ID = ?"; if (!StringUtils.isEmpty(filter.getVersion()) || !StringUtils.isEmpty(filter.getAppReleaseState())
|| !StringUtils.isEmpty(filter.getAppReleaseType())) {
if (filter == null) { sql += "INNER JOIN AP_APP_RELEASE ON AP_APP.ID = AP_APP_RELEASE.AP_APP_ID ";
String msg = "Filter is not instantiated.";
log.error(msg);
throw new ApplicationManagementDAOException(msg);
} }
if (!StringUtils.isEmpty(filter.getAppType())) { if (!StringUtils.isEmpty(filter.getAppType())) {
sql += " AND AP_APP.TYPE = ?"; sql += "AND AP_APP.TYPE = ? ";
} }
if (!StringUtils.isEmpty(filter.getAppName())) { if (!StringUtils.isEmpty(filter.getAppName())) {
sql += " AND LOWER (AP_APP.NAME) "; sql += " AND LOWER (AP_APP.NAME) ";
if (filter.isFullMatch()) { if (filter.isFullMatch()) {
sql += "= ?"; sql += "= ? ";
} else { } else {
sql += "LIKE ?"; sql += "LIKE ? ";
} }
} }
if (!StringUtils.isEmpty(filter.getSubscriptionType())) { if (!StringUtils.isEmpty(filter.getSubscriptionType())) {
sql += " AND AP_APP.SUB_TYPE = ?"; sql += "AND AP_APP.SUB_TYPE = ? ";
} }
if (filter.getMinimumRating() > 0) { if (filter.getMinimumRating() > 0) {
sql += " AND AP_APP.RATING >= ?"; sql += "AND AP_APP.RATING >= ? ";
} }
if (!StringUtils.isEmpty(filter.getVersion())) { if (!StringUtils.isEmpty(filter.getVersion())) {
sql += " AND AP_APP_RELEASE.VERSION = ?"; sql += "AND AP_APP_RELEASE.VERSION = ? ";
} }
if (!StringUtils.isEmpty(filter.getAppReleaseType())) { if (!StringUtils.isEmpty(filter.getAppReleaseType())) {
sql += " AND AP_APP_RELEASE.RELEASE_TYPE = ?"; sql += "AND AP_APP_RELEASE.RELEASE_TYPE = ? ";
} }
if (!StringUtils.isEmpty(filter.getAppReleaseState())) { if (!StringUtils.isEmpty(filter.getAppReleaseState())) {
sql += " AND AP_APP_RELEASE.CURRENT_STATE = ?"; sql += "AND AP_APP_RELEASE.CURRENT_STATE = ? ";
} }
if (deviceTypeId != -1) { if (deviceTypeId != -1) {
sql += " AND AP_APP.DEVICE_TYPE_ID = ?"; sql += "AND AP_APP.DEVICE_TYPE_ID = ? ";
} }
sql += "GROUP BY AP_APP.ID ";
if (filter.getLimit() == -1) {
sql = sql.replace("ORDER BY ID OFFSET ? ROWS FETCH NEXT ? ROWS ONLY", "");
}
String sortingOrder = "ASC";
if (!StringUtils.isEmpty(filter.getSortBy())) { if (!StringUtils.isEmpty(filter.getSortBy())) {
sortingOrder = filter.getSortBy(); sql += "ORDER BY ID " + filter.getSortBy() + " ";
} }
sql += " ORDER BY APP_ID " + sortingOrder; if (filter.getLimit() != -1) {
sql += "ORDER BY ID OFFSET ? ROWS FETCH NEXT ? ROWS ONLY ";
}
sql += ") AS app_data ON app_data.ID = AP_APP.ID " +
"WHERE AP_APP.TENANT_ID = ?";
try { try {
Connection conn = this.getDBConnection(); Connection conn = this.getDBConnection();
try (PreparedStatement stmt = conn.prepareStatement(sql); try (PreparedStatement stmt = conn.prepareStatement(sql)) {
){ int paramIndex = 1;
if (filter.getLimit() != -1) { if (!StringUtils.isEmpty(filter.getAppType())) {
stmt.setInt(paramIndex++, filter.getOffset());
if (filter.getLimit() == 0) {
stmt.setInt(paramIndex++, 100);
} else {
stmt.setInt(paramIndex++, filter.getLimit());
}
}
stmt.setInt(paramIndex++, tenantId);
if (filter.getAppType() != null && !filter.getAppType().isEmpty()) {
stmt.setString(paramIndex++, filter.getAppType()); stmt.setString(paramIndex++, filter.getAppType());
} }
if (filter.getAppName() != null && !filter.getAppName().isEmpty()) { if (!StringUtils.isEmpty(filter.getAppName())) {
if (filter.isFullMatch()) { if (filter.isFullMatch()) {
stmt.setString(paramIndex++, filter.getAppName().toLowerCase()); stmt.setString(paramIndex++, filter.getAppName().toLowerCase());
} else { } else {
@ -167,10 +155,15 @@ public class SQLServerApplicationDAOImpl extends GenericApplicationDAOImpl {
if (!StringUtils.isEmpty(filter.getAppReleaseState())) { if (!StringUtils.isEmpty(filter.getAppReleaseState())) {
stmt.setString(paramIndex++, filter.getAppReleaseState()); stmt.setString(paramIndex++, filter.getAppReleaseState());
} }
if (deviceTypeId > 0 ) { if (deviceTypeId > 0) {
stmt.setInt(paramIndex, deviceTypeId); stmt.setInt(paramIndex++, deviceTypeId);
}
if (filter.getLimit() != -1) {
stmt.setInt(paramIndex++, filter.getOffset());
stmt.setInt(paramIndex++, filter.getLimit());
} }
try (ResultSet rs = stmt.executeQuery() ) { stmt.setInt(paramIndex, tenantId);
try (ResultSet rs = stmt.executeQuery()) {
return DAOUtil.loadApplications(rs); return DAOUtil.loadApplications(rs);
} }
} }

@ -608,9 +608,6 @@ public class ApplicationManagerImpl implements ApplicationManager {
if (!StringUtils.isEmpty(filter.getDeviceType())) { if (!StringUtils.isEmpty(filter.getDeviceType())) {
deviceType = APIUtil.getDeviceTypeData(filter.getDeviceType()); deviceType = APIUtil.getDeviceTypeData(filter.getDeviceType());
} }
if (filter.getLimit() == 0) {
filter.setLimit(20);
}
if (deviceType == null) { if (deviceType == null) {
deviceType = new DeviceType(); deviceType = new DeviceType();

Loading…
Cancel
Save