diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.common/pom.xml b/components/application-mgt/org.wso2.carbon.device.application.mgt.common/pom.xml index 976bbb84c77..e332baf0be5 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.common/pom.xml +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.common/pom.xml @@ -122,8 +122,6 @@ org.codehaus.jackson jackson-core-asl - - diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/ReviewNode.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/ReviewNode.java new file mode 100644 index 00000000000..5a7f9930b7f --- /dev/null +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/ReviewNode.java @@ -0,0 +1,67 @@ +package org.wso2.carbon.device.application.mgt.common; +/* 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. + */ + + + +import java.util.ArrayList; +import java.util.List; + +public class ReviewNode { + + private T data = null; + + private List> children = new ArrayList<>(); + + private ReviewNode parent = null; + + public ReviewNode(T data) { + this.data = data; + } + + public ReviewNode addChild(ReviewNode child) { + child.setParent(this); + this.children.add(child); + return child; + } + + public void addChildren(List> children) { + children.forEach(each -> each.setParent(this)); + this.children.addAll(children); + } + + public List> getChildren() { + return children; + } + + public T getData() { + return data; + } + + public void setData(T data) { + this.data = data; + } + + private void setParent(ReviewNode parent) { + this.parent = parent; + } + + public ReviewNode getParent() { + return parent; + } + +} \ No newline at end of file diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/Review.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/ReviewTmp.java similarity index 87% rename from components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/Review.java rename to components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/ReviewTmp.java index e2a488ce3e0..98998dbfebd 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/Review.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/ReviewTmp.java @@ -23,8 +23,8 @@ import io.swagger.annotations.ApiModelProperty; import java.sql.Timestamp; -@ApiModel(value = "Review", description = "Review represents the user's review for an application release") -public class Review { +@ApiModel(value = "ReviewTmp", description = "ReviewTmp represents the user's review for an application release") +public class ReviewTmp { @ApiModelProperty(name = "id", value = "The Id given to the comment when it store to the App manager") @@ -55,9 +55,9 @@ public class Review { value = "Rating value of the application release") private int rating; - @ApiModelProperty(name = "replyReview", + @ApiModelProperty(name = "replyReviewTmp", value = "Replying review") - private Review replyReview; + private ReviewTmp replyReviewTmp; public int getId() { return id; @@ -115,12 +115,12 @@ public class Review { this.parentId = parentId; } - public Review getReplyReview() { - return replyReview; + public ReviewTmp getReplyReviewTmp() { + return replyReviewTmp; } - public void setReplyReview(Review replyReview) { - this.replyReview = replyReview; + public void setReplyReviewTmp(ReviewTmp replyReviewTmp) { + this.replyReviewTmp = replyReviewTmp; } } diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/dto/ReviewDTO.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/dto/ReviewDTO.java new file mode 100644 index 00000000000..64cc3a11d2c --- /dev/null +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/dto/ReviewDTO.java @@ -0,0 +1,87 @@ +/* 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.dto; + +import java.sql.Timestamp; + +public class ReviewDTO { + private int id; + private String content; + private String username; + private Timestamp createdAt; + private Timestamp modifiedAt; + private int rating; + private int rootParentId; + private int immediateParentId; + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getContent() { + return content; + } + + public void setContent(String content) { + this.content = content; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public Timestamp getCreatedAt() { + return createdAt; + } + + public void setCreatedAt(Timestamp createdAt) { + this.createdAt = createdAt; + } + + public Timestamp getModifiedAt() { + return modifiedAt; + } + + public void setModifiedAt(Timestamp modifiedAt) { + this.modifiedAt = modifiedAt; + } + + public int getRating() { + return rating; + } + + public void setRating(int rating) { + this.rating = rating; + } + + public int getRootParentId() { return rootParentId; } + + public void setRootParentId(int rootParentId) { this.rootParentId = rootParentId; } + + public int getImmediateParentId() { return immediateParentId; } + + public void setImmediateParentId(int immediateParentId) { this.immediateParentId = immediateParentId; } +} diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/response/Review.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/response/Review.java new file mode 100644 index 00000000000..4acfa1e6a6e --- /dev/null +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/response/Review.java @@ -0,0 +1,102 @@ +/* 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.response; + +import java.sql.Timestamp; +import java.util.List; + +public class Review { + + private int id; + private String content; + private int rootParentId; + private int immediateParentId; + private String username; + private Timestamp createdAt; + private Timestamp modifiedAt; + private int rating; + private List replies; + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getContent() { + return content; + } + + public void setContent(String content) { + this.content = content; + } + + public int getRootParentId() { + return rootParentId; + } + + public void setRootParentId(int rootParentId) { + this.rootParentId = rootParentId; + } + + public int getImmediateParentId() { + return immediateParentId; + } + + public void setImmediateParentId(int immediateParentId) { + this.immediateParentId = immediateParentId; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public Timestamp getCreatedAt() { + return createdAt; + } + + public void setCreatedAt(Timestamp createdAt) { + this.createdAt = createdAt; + } + + public Timestamp getModifiedAt() { + return modifiedAt; + } + + public void setModifiedAt(Timestamp modifiedAt) { + this.modifiedAt = modifiedAt; + } + + public int getRating() { + return rating; + } + + public void setRating(int rating) { + this.rating = rating; + } + + public List getReplies() { return replies; } + + public void setReplies(List replies) { this.replies = replies; } +} diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/services/ApplicationManager.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/services/ApplicationManager.java index 9b9874062ed..cf49bf2a326 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/services/ApplicationManager.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/services/ApplicationManager.java @@ -150,8 +150,9 @@ public interface ApplicationManager { * @param releaseUuid UUID of the ApplicationDTO Release. * @param lifecycleChanger Lifecycle changer that contains the action and the reson for the change. * @throws ApplicationManagementException ApplicationDTO Management Exception. + * @return */ - void changeLifecycleState(String releaseUuid, LifecycleChanger lifecycleChanger) + ApplicationRelease changeLifecycleState(String releaseUuid, LifecycleChanger lifecycleChanger) throws ApplicationManagementException; /** diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/services/ReviewManager.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/services/ReviewManager.java index 82c751feb75..d677fa0e562 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/services/ReviewManager.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/services/ReviewManager.java @@ -18,16 +18,14 @@ */ package org.wso2.carbon.device.application.mgt.common.services; -import javassist.NotFoundException; import org.wso2.carbon.device.application.mgt.common.Rating; -import org.wso2.carbon.device.application.mgt.common.Review; +import org.wso2.carbon.device.application.mgt.common.ReviewTmp; import org.wso2.carbon.device.application.mgt.common.PaginationRequest; import org.wso2.carbon.device.application.mgt.common.PaginationResult; import org.wso2.carbon.device.application.mgt.common.exception.ApplicationManagementException; -import org.wso2.carbon.device.application.mgt.common.exception.RequestValidatingException; import org.wso2.carbon.device.application.mgt.common.exception.ReviewDoesNotExistException; import org.wso2.carbon.device.application.mgt.common.exception.ReviewManagementException; - +import org.wso2.carbon.device.application.mgt.common.wrapper.ReviewWrapper; /** * ReviewManager is responsible for handling all the add/update/delete/get operations related with @@ -35,15 +33,18 @@ import org.wso2.carbon.device.application.mgt.common.exception.ReviewManagementE public interface ReviewManager { /** - * To add a review to an application release + * To add a reviewTmp to an application release * - * @param review review of the application. + * @param reviewWrapper reviewTmp of the application. * @param uuid uuid of the application release. - * @return {@link Review} Review added - * @throws ReviewManagementException Exceptions of the review management. + * @return {@link ReviewTmp} ReviewTmp added + * @throws ReviewManagementException Exceptions of the reviewTmp management. */ - boolean addReview(Review review, String uuid) - throws ReviewManagementException, RequestValidatingException, ApplicationManagementException; + boolean addReview(ReviewWrapper reviewWrapper, String uuid) + throws ReviewManagementException, ApplicationManagementException; + + boolean addReplyComment(ReviewWrapper reviewWrapper, String uuid, int parentReviewId) + throws ReviewManagementException, ApplicationManagementException; /** * Get all review with pagination @@ -53,7 +54,8 @@ public interface ReviewManager { * @return {@link PaginationResult} pagination result with starting offSet and limit * @throws ReviewManagementException Exceptions of the comment management. */ - PaginationResult getAllReviews(PaginationRequest request, String uuid) throws ReviewManagementException; + PaginationResult getAllReviews(PaginationRequest request, String uuid) + throws ReviewManagementException, ApplicationManagementException; /** * To delete review using review id. @@ -67,24 +69,21 @@ public interface ReviewManager { throws ReviewManagementException, ReviewDoesNotExistException; /** - * To update a review. + * To update a reviewTmp. * - * @param review review of the application. - * @param reviewId id of the review + * @param reviewId id of the reviewTmp * @param uuid UUID of the application release - * @param existingReview Pass existing review when same user adding a review for same application release, - * otherwise pass null - * @return {@link Review}updated review - * @throws ReviewManagementException Exceptions of the review management + * @return {@link ReviewTmp}updated reviewTmp + * @throws ReviewManagementException Exceptions of the reviewTmp management */ - boolean updateReview(Review review, int reviewId, String uuid, Review existingReview) - throws ReviewManagementException, RequestValidatingException; + boolean updateReview(ReviewWrapper updatingReview, int reviewId, String uuid) + throws ReviewManagementException, ApplicationManagementException; /** * To get the overall rating for a application release * * @param appReleaseUuuid UUID of the application release. - * @return {@link Review}updated review + * @return {@link ReviewTmp}updated review * @throws ReviewManagementException Exceptions of the review management */ Rating getRating(String appReleaseUuuid) throws ReviewManagementException; diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/wrapper/ReviewWrapper.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/wrapper/ReviewWrapper.java new file mode 100644 index 00000000000..120df8cc1b6 --- /dev/null +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/wrapper/ReviewWrapper.java @@ -0,0 +1,39 @@ +/* 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.wrapper; + +public class ReviewWrapper { + private String content; + private int rating; + + public String getContent() { + return content; + } + + public void setContent(String content) { + this.content = content; + } + + public int getRating() { + return rating; + } + + public void setRating(int rating) { + this.rating = rating; + } +} diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/ReviewDAO.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/ReviewDAO.java index 1018bc78b2d..e7f74cdeb0f 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/ReviewDAO.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/ReviewDAO.java @@ -18,8 +18,9 @@ */ package org.wso2.carbon.device.application.mgt.core.dao; -import org.wso2.carbon.device.application.mgt.common.Review; +import org.wso2.carbon.device.application.mgt.common.ReviewTmp; import org.wso2.carbon.device.application.mgt.common.PaginationRequest; +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.exception.DBConnectionException; import org.wso2.carbon.device.application.mgt.core.exception.ReviewManagementDAOException; @@ -34,38 +35,37 @@ import java.util.List; public interface ReviewDAO { /** - * To add a review to an application release. + * To add a reviewTmp to an application release. * * @param tenantId tenantId. - * @param review review of the application. - * @param uuid UUID of the application release - * @return If review is added successfully, it return true otherwise false - * @throws ReviewManagementDAOException Exceptions of the review management DAO. + * @param reviewDTO reviewTmp of the application. + * @param appReleaseId UUID of the application release + * @return If reviewTmp is added successfully, it return true otherwise false + * @throws ReviewManagementDAOException Exceptions of the reviewTmp management DAO. */ - boolean addReview(Review review, String uuid, int tenantId) throws ReviewManagementDAOException; + boolean addReview(ReviewDTO reviewDTO, int appReleaseId, int tenantId) throws ReviewManagementDAOException; /** * To verify whether user has already commented for the application release or not. * - * @param uuid UUID of the application release. + * @param appReleaseId ID of the application release. * @param username username of the logged in user. * @param tenantId tenantId of the commented application. * @return If review exists, review returns * @throws ReviewManagementDAOException Exceptions of the review management DAO. */ - Review haveUerCommented(String uuid, String username, int tenantId) throws ReviewManagementDAOException; + boolean haveUerReviewed(int appReleaseId, String username, int tenantId) throws ReviewManagementDAOException; /** * To update already added comment. * - * @param review Updating review - * @param reviewId id of the updating review - * @param username review owner + * @param reviewDTO Updating reviewTmp + * @param reviewId id of the updating reviewTmp * @param tenantId tenant id * @return row count if updating is succeed otherwise 0 - * @throws ReviewManagementDAOException Exceptions of the review management. + * @throws ReviewManagementDAOException Exceptions of the reviewTmp management. */ - int updateReview(Review review, int reviewId, String username, int tenantId) + int updateReview(ReviewDTO reviewDTO, int reviewId, int tenantId) throws ReviewManagementDAOException; @@ -73,23 +73,29 @@ import java.util.List; * To get the comment with id. * * @param reviewId id of the review - * @return {@link Review}Review + * @return {@link ReviewTmp}ReviewTmp * @throws ReviewManagementDAOException Exceptions of the review management DAO. */ - Review getReview(int reviewId) throws ReviewManagementDAOException; + ReviewDTO getReview(int reviewId) throws ReviewManagementDAOException; + + ReviewDTO getReview(int appReleaseId, int reviewId) throws ReviewManagementDAOException; + /** * To get all reviews * - * @param uuid uuid of the application + * @param releaseId ID of the application release. * @param request {@link PaginationRequest}pagination request with offSet and limit * @param tenantId Tenant id * @return {@link List}List of all reviews for the application release - * @throws ReviewManagementDAOException Review management DAO exception + * @throws ReviewManagementDAOException ReviewTmp management DAO exception **/ - List getAllReviews(String uuid, PaginationRequest request, int tenantId) + List getAllReviews(int releaseId, PaginationRequest request, int tenantId) throws ReviewManagementDAOException; + List getReplyComments(int parentId, int tenantId) + throws ReviewManagementDAOException; + /** * To get list of comments using release id and application id. * @param uuid UUID of the application release @@ -119,7 +125,7 @@ import java.util.List; * @param username username of the review owner * @param reviewId id of the review * @return If review is successfully deleted return 1, otherwise returns 0. - * @throws ReviewManagementDAOException Review management DAO exception. + * @throws ReviewManagementDAOException ReviewTmp management DAO exception. */ int deleteReview(String username, int reviewId) throws ReviewManagementDAOException; @@ -137,8 +143,8 @@ import java.util.List; * To get review count for a specific application release * * @param uuid uuid of the application release - * @return Review count - * @throws ReviewManagementDAOException Review management DAO exception + * @return ReviewTmp count + * @throws ReviewManagementDAOException ReviewTmp management DAO exception */ int getReviewCount(String uuid) throws ReviewManagementDAOException; } \ No newline at end of file diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/common/ApplicationManagementDAOFactory.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/common/ApplicationManagementDAOFactory.java index 1aa44c03322..b800a4fd5ac 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/common/ApplicationManagementDAOFactory.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/common/ApplicationManagementDAOFactory.java @@ -23,7 +23,7 @@ import org.apache.commons.logging.LogFactory; import org.wso2.carbon.device.application.mgt.common.exception.UnsupportedDatabaseEngineException; import org.wso2.carbon.device.application.mgt.core.config.ConfigurationManager; import org.wso2.carbon.device.application.mgt.core.dao.*; -import org.wso2.carbon.device.application.mgt.core.dao.impl.Review.ReviewDAOImpl; +import org.wso2.carbon.device.application.mgt.core.dao.impl.review.ReviewDAOImpl; import org.wso2.carbon.device.application.mgt.core.dao.impl.application.GenericApplicationDAOImpl; import org.wso2.carbon.device.application.mgt.core.dao.impl.application.release.GenericApplicationReleaseDAOImpl; import org.wso2.carbon.device.application.mgt.core.dao.impl.application.OracleApplicationDAOImpl; diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/impl/application/GenericApplicationDAOImpl.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/impl/application/GenericApplicationDAOImpl.java index 0120cccf6b5..59ef55e1b47 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/impl/application/GenericApplicationDAOImpl.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/impl/application/GenericApplicationDAOImpl.java @@ -30,7 +30,7 @@ import org.wso2.carbon.device.application.mgt.common.Filter; import org.wso2.carbon.device.application.mgt.common.dto.TagDTO; import org.wso2.carbon.device.application.mgt.common.exception.DBConnectionException; import org.wso2.carbon.device.application.mgt.core.dao.ApplicationDAO; -import org.wso2.carbon.device.application.mgt.core.dao.common.Util; +import org.wso2.carbon.device.application.mgt.core.util.DAOUtil; import org.wso2.carbon.device.application.mgt.core.dao.impl.AbstractDAOImpl; import org.wso2.carbon.device.application.mgt.core.exception.ApplicationManagementDAOException; import org.wso2.carbon.device.application.mgt.core.exception.UnexpectedServerErrorException; @@ -90,7 +90,7 @@ public class GenericApplicationDAOImpl extends AbstractDAOImpl implements Applic } catch (SQLException e) { throw new ApplicationManagementDAOException("Error occurred while adding the application", e); } finally { - Util.cleanupResources(stmt, rs); + DAOUtil.cleanupResources(stmt, rs); } } @@ -120,7 +120,7 @@ public class GenericApplicationDAOImpl extends AbstractDAOImpl implements Applic throw new ApplicationManagementDAOException( "DB connection error occured while checking whether application exist or not.", e); } finally { - Util.cleanupResources(stmt, rs); + DAOUtil.cleanupResources(stmt, rs); } } @@ -158,6 +158,7 @@ public class GenericApplicationDAOImpl extends AbstractDAOImpl implements Applic + "AP_APP_RELEASE.APP_HASH_VALUE AS RELEASE_HASH_VALUE, " + "AP_APP_RELEASE.APP_PRICE AS RELEASE_PRICE, " + "AP_APP_RELEASE.APP_META_INFO AS RELEASE_META_INFO, " + + "AP_APP_RELEASE.PACKAGE_NAME AS PACKAGE_NAME, " + "AP_APP_RELEASE.SUPPORTED_OS_VERSIONS AS RELEASE_SUP_OS_VERSIONS, " + "AP_APP_RELEASE.RATING AS RELEASE_RATING, " + "AP_APP_RELEASE.CURRENT_STATE AS RELEASE_CURRENT_STATE, " @@ -248,7 +249,7 @@ public class GenericApplicationDAOImpl extends AbstractDAOImpl implements Applic } stmt.setInt(paramIndex, filter.getOffset()); rs = stmt.executeQuery(); - return Util.loadApplications(rs); + return DAOUtil.loadApplications(rs); } catch (SQLException e) { throw new ApplicationManagementDAOException("Error occurred while getting application list for the tenant" + " " + tenantId + ". While executing " + sql, e); @@ -259,7 +260,7 @@ public class GenericApplicationDAOImpl extends AbstractDAOImpl implements Applic } catch (JSONException e) { throw new ApplicationManagementDAOException("Error occurred while parsing JSON ", e); } finally { - Util.cleanupResources(stmt, rs); + DAOUtil.cleanupResources(stmt, rs); } } @@ -294,7 +295,7 @@ public class GenericApplicationDAOImpl extends AbstractDAOImpl implements Applic throw new ApplicationManagementDAOException("Error occurred while obtaining the DB connection for " + "getting app release id", e); } finally { - Util.cleanupResources(stmt, rs); + DAOUtil.cleanupResources(stmt, rs); } } @@ -338,7 +339,7 @@ public class GenericApplicationDAOImpl extends AbstractDAOImpl implements Applic } catch (DBConnectionException e) { throw new ApplicationManagementDAOException("Error occurred while obtaining the DB connection.", e); } finally { - Util.cleanupResources(stmt, rs); + DAOUtil.cleanupResources(stmt, rs); } return count; } @@ -373,7 +374,7 @@ public class GenericApplicationDAOImpl extends AbstractDAOImpl implements Applic + appType + "and app name " + appName); } - return Util.loadApplication(rs); + return DAOUtil.loadApplication(rs); } catch (SQLException e) { throw new ApplicationManagementDAOException( @@ -386,7 +387,7 @@ public class GenericApplicationDAOImpl extends AbstractDAOImpl implements Applic } catch (UnexpectedServerErrorException e) { throw new ApplicationManagementDAOException("Error occurred while obtaining the DB connection.", e); } finally { - Util.cleanupResources(stmt, rs); + DAOUtil.cleanupResources(stmt, rs); } } @@ -416,7 +417,7 @@ public class GenericApplicationDAOImpl extends AbstractDAOImpl implements Applic log.debug("Successfully retrieved basic details of the application with the id:" + id); } - return Util.loadApplication(rs); + return DAOUtil.loadApplication(rs); } catch (SQLException e) { throw new ApplicationManagementDAOException( @@ -429,7 +430,7 @@ public class GenericApplicationDAOImpl extends AbstractDAOImpl implements Applic } catch (UnexpectedServerErrorException e) { throw new ApplicationManagementDAOException("Error occurred while obtaining the DB connection.", e); } finally { - Util.cleanupResources(stmt, rs); + DAOUtil.cleanupResources(stmt, rs); } } @@ -468,6 +469,7 @@ public class GenericApplicationDAOImpl extends AbstractDAOImpl implements Applic + "AP_APP_RELEASE.APP_HASH_VALUE AS RELEASE_HASH_VALUE, " + "AP_APP_RELEASE.APP_PRICE AS RELEASE_PRICE, " + "AP_APP_RELEASE.APP_META_INFO AS RELEASE_META_INFO, " + + "AP_APP_RELEASE.PACKAGE_NAME AS PACKAGE_NAME, " + "AP_APP_RELEASE.SUPPORTED_OS_VERSIONS AS RELEASE_SUP_OS_VERSIONS, " + "AP_APP_RELEASE.RATING AS RELEASE_RATING, " + "AP_APP_RELEASE.CURRENT_STATE AS RELEASE_CURRENT_STATE, " @@ -490,7 +492,7 @@ public class GenericApplicationDAOImpl extends AbstractDAOImpl implements Applic + releaseUuid); } - return Util.loadApplication(rs); + return DAOUtil.loadApplication(rs); } catch (SQLException e) { throw new ApplicationManagementDAOException( @@ -503,7 +505,7 @@ public class GenericApplicationDAOImpl extends AbstractDAOImpl implements Applic } catch (UnexpectedServerErrorException e) { throw new ApplicationManagementDAOException("Error occurred while obtaining the DB connection.", e); } finally { - Util.cleanupResources(stmt, rs); + DAOUtil.cleanupResources(stmt, rs); } } @@ -542,6 +544,7 @@ public class GenericApplicationDAOImpl extends AbstractDAOImpl implements Applic + "AP_APP_RELEASE.APP_HASH_VALUE AS RELEASE_HASH_VALUE, " + "AP_APP_RELEASE.APP_PRICE AS RELEASE_PRICE, " + "AP_APP_RELEASE.APP_META_INFO AS RELEASE_META_INFO, " + + "AP_APP_RELEASE.PACKAGE_NAME AS PACKAGE_NAME, " + "AP_APP_RELEASE.SUPPORTED_OS_VERSIONS AS RELEASE_SUP_OS_VERSIONS, " + "AP_APP_RELEASE.RATING AS RELEASE_RATING, " + "AP_APP_RELEASE.CURRENT_STATE AS RELEASE_CURRENT_STATE, " @@ -562,7 +565,7 @@ public class GenericApplicationDAOImpl extends AbstractDAOImpl implements Applic log.debug("Successfully retrieved basic details of the application with the id " + applicationId); } - return Util.loadApplication(rs); + return DAOUtil.loadApplication(rs); } catch (SQLException e) { throw new ApplicationManagementDAOException( "Error occurred while getting application details with app id " + applicationId + @@ -574,7 +577,7 @@ public class GenericApplicationDAOImpl extends AbstractDAOImpl implements Applic } catch (UnexpectedServerErrorException e) { throw new ApplicationManagementDAOException("Error occurred while obtaining the DB connection.", e); } finally { - Util.cleanupResources(stmt, rs); + DAOUtil.cleanupResources(stmt, rs); } } @@ -607,7 +610,7 @@ public class GenericApplicationDAOImpl extends AbstractDAOImpl implements Applic } catch (DBConnectionException e) { throw new ApplicationManagementDAOException("Error occurred while obtaining the DB connection.", e); } finally { - Util.cleanupResources(stmt, rs); + DAOUtil.cleanupResources(stmt, rs); } } @@ -662,7 +665,7 @@ public class GenericApplicationDAOImpl extends AbstractDAOImpl implements Applic } catch (SQLException e) { throw new ApplicationManagementDAOException("Error occurred while deleting the application: ", e); } finally { - Util.cleanupResources(stmt, null); + DAOUtil.cleanupResources(stmt, null); } } @@ -693,7 +696,7 @@ public class GenericApplicationDAOImpl extends AbstractDAOImpl implements Applic } catch (SQLException e) { throw new ApplicationManagementDAOException("Error occurred while adding tags", e); } finally { - Util.cleanupResources(stmt, null); + DAOUtil.cleanupResources(stmt, null); } } @@ -730,7 +733,7 @@ public class GenericApplicationDAOImpl extends AbstractDAOImpl implements Applic } catch (SQLException e) { throw new ApplicationManagementDAOException("Error occurred while adding tags", e); } finally { - Util.cleanupResources(stmt, rs); + DAOUtil.cleanupResources(stmt, rs); } } @@ -767,7 +770,7 @@ public class GenericApplicationDAOImpl extends AbstractDAOImpl implements Applic } catch (SQLException e) { throw new ApplicationManagementDAOException("Error occurred while getting categories", e); } finally { - Util.cleanupResources(stmt, rs); + DAOUtil.cleanupResources(stmt, rs); } } @@ -859,7 +862,7 @@ public class GenericApplicationDAOImpl extends AbstractDAOImpl implements Applic } catch (SQLException e) { throw new ApplicationManagementDAOException("Error occurred while adding categories.", e); } finally { - Util.cleanupResources(stmt, null); + DAOUtil.cleanupResources(stmt, null); } } @@ -892,7 +895,7 @@ public class GenericApplicationDAOImpl extends AbstractDAOImpl implements Applic } catch (SQLException e) { throw new ApplicationManagementDAOException("Error occurred while adding data into category mapping.", e); } finally { - Util.cleanupResources(stmt, null); + DAOUtil.cleanupResources(stmt, null); } } @@ -1101,7 +1104,7 @@ public class GenericApplicationDAOImpl extends AbstractDAOImpl implements Applic } catch (SQLException e) { throw new ApplicationManagementDAOException("Error occurred while adding tags", e); } finally { - Util.cleanupResources(stmt, null); + DAOUtil.cleanupResources(stmt, null); } } @@ -1459,7 +1462,7 @@ public class GenericApplicationDAOImpl extends AbstractDAOImpl implements Applic throw new ApplicationManagementDAOException( "Error occurred while deleting tags of application: " + applicationId, e); } finally { - Util.cleanupResources(stmt, null); + DAOUtil.cleanupResources(stmt, null); } } @@ -1497,7 +1500,7 @@ public class GenericApplicationDAOImpl extends AbstractDAOImpl implements Applic ApplicationDTO application = null; while (rs.next()) { - ApplicationReleaseDTO appRelease = Util.loadApplicationRelease(rs); + ApplicationReleaseDTO appRelease = DAOUtil.loadApplicationRelease(rs); application = new ApplicationDTO(); application.setId(rs.getInt("APP_ID")); @@ -1528,7 +1531,7 @@ public class GenericApplicationDAOImpl extends AbstractDAOImpl implements Applic } catch (DBConnectionException e) { throw new ApplicationManagementDAOException("Error occurred while obtaining the DB connection.", e); } finally { - Util.cleanupResources(stmt, rs); + DAOUtil.cleanupResources(stmt, rs); } } @@ -1557,7 +1560,7 @@ public class GenericApplicationDAOImpl extends AbstractDAOImpl implements Applic } catch (SQLException e) { throw new ApplicationManagementDAOException("Error occurred while getting application List", e); } finally { - Util.cleanupResources(stmt, rs); + DAOUtil.cleanupResources(stmt, rs); } } diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/impl/application/OracleApplicationDAOImpl.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/impl/application/OracleApplicationDAOImpl.java index 0e49ea4a061..56432d8db03 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/impl/application/OracleApplicationDAOImpl.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/impl/application/OracleApplicationDAOImpl.java @@ -21,20 +21,6 @@ package org.wso2.carbon.device.application.mgt.core.dao.impl.application; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.json.JSONException; -import org.wso2.carbon.device.application.mgt.common.AppLifecycleState; -import org.wso2.carbon.device.application.mgt.common.ApplicationList; -import org.wso2.carbon.device.application.mgt.common.Filter; -import org.wso2.carbon.device.application.mgt.common.Pagination; -import org.wso2.carbon.device.application.mgt.common.exception.DBConnectionException; -import org.wso2.carbon.device.application.mgt.core.dao.common.Util; -import org.wso2.carbon.device.application.mgt.core.dao.impl.application.GenericApplicationDAOImpl; -import org.wso2.carbon.device.application.mgt.core.exception.ApplicationManagementDAOException; - -import java.sql.Connection; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; /** * This is a ApplicationDAO Implementation specific to Oracle. diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/impl/application/release/GenericApplicationReleaseDAOImpl.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/impl/application/release/GenericApplicationReleaseDAOImpl.java index 808d1603dfb..93663008c81 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/impl/application/release/GenericApplicationReleaseDAOImpl.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/impl/application/release/GenericApplicationReleaseDAOImpl.java @@ -21,13 +21,11 @@ package org.wso2.carbon.device.application.mgt.core.dao.impl.application.release import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.wso2.carbon.device.application.mgt.common.AppLifecycleState; import org.wso2.carbon.device.application.mgt.common.dto.ApplicationReleaseDTO; -import org.wso2.carbon.device.application.mgt.common.ApplicationReleaseArtifactPaths; import org.wso2.carbon.device.application.mgt.common.Rating; import org.wso2.carbon.device.application.mgt.common.exception.DBConnectionException; import org.wso2.carbon.device.application.mgt.core.dao.ApplicationReleaseDAO; -import org.wso2.carbon.device.application.mgt.core.dao.common.Util; +import org.wso2.carbon.device.application.mgt.core.util.DAOUtil; import org.wso2.carbon.device.application.mgt.core.dao.impl.AbstractDAOImpl; import org.wso2.carbon.device.application.mgt.core.exception.ApplicationManagementDAOException; @@ -118,7 +116,7 @@ public class GenericApplicationReleaseDAOImpl extends AbstractDAOImpl implements throw new ApplicationManagementDAOException( "Database Connection Exception while trying to release a new version", e); } finally { - Util.cleanupResources(statement, resultSet); + DAOUtil.cleanupResources(statement, resultSet); } } @@ -160,7 +158,7 @@ public class GenericApplicationReleaseDAOImpl extends AbstractDAOImpl implements resultSet = statement.executeQuery(); if (resultSet.next()) { - return Util.loadApplicationRelease(resultSet); + return DAOUtil.loadApplicationRelease(resultSet); } return null; } catch (DBConnectionException e) { @@ -170,7 +168,7 @@ public class GenericApplicationReleaseDAOImpl extends AbstractDAOImpl implements throw new ApplicationManagementDAOException( "Error while getting release details of the application " + applicationName + " and version " + versionName + " , while executing the query " + sql, e); } finally { - Util.cleanupResources(statement, resultSet); + DAOUtil.cleanupResources(statement, resultSet); } } @@ -207,7 +205,7 @@ public class GenericApplicationReleaseDAOImpl extends AbstractDAOImpl implements resultSet = statement.executeQuery(); if (resultSet.next()) { - return Util.loadApplicationRelease(resultSet); + return DAOUtil.loadApplicationRelease(resultSet); } return null; } catch (DBConnectionException e) { @@ -219,7 +217,7 @@ public class GenericApplicationReleaseDAOImpl extends AbstractDAOImpl implements "Error while getting release details of the application id: " + applicationId + " and theUUID of the application " + "release: " + releaseUuid + " , while executing the query " + sql, e); } finally { - Util.cleanupResources(statement, resultSet); + DAOUtil.cleanupResources(statement, resultSet); } } @@ -241,6 +239,7 @@ public class GenericApplicationReleaseDAOImpl extends AbstractDAOImpl implements + "AR.APP_HASH_VALUE AS RELEASE_HASH_VALUE, " + "AR.APP_PRICE AS RELEASE_PRICE, " + "AR.APP_META_INFO AS RELEASE_META_INFO, " + + "AR.PACKAGE_NAME AS PACKAGE_NAME, " + "AR.SUPPORTED_OS_VERSIONS AS RELEASE_SUP_OS_VERSIONS, " + "AR.RATING AS RELEASE_RATING, " + "AR.CURRENT_STATE AS RELEASE_CURRENT_STATE, " @@ -255,7 +254,7 @@ public class GenericApplicationReleaseDAOImpl extends AbstractDAOImpl implements statement.setInt(2, tenantId); try (ResultSet resultSet = statement.executeQuery()) { if (resultSet.next()) { - return Util.loadAppRelease(resultSet); + return DAOUtil.loadAppRelease(resultSet); } return null; } @@ -299,7 +298,7 @@ public class GenericApplicationReleaseDAOImpl extends AbstractDAOImpl implements resultSet = statement.executeQuery(); while (resultSet.next()) { - ApplicationReleaseDTO applicationRelease = Util.loadApplicationRelease(resultSet); + ApplicationReleaseDTO applicationRelease = DAOUtil.loadApplicationRelease(resultSet); applicationReleases.add(applicationRelease); } return applicationReleases; @@ -311,7 +310,7 @@ public class GenericApplicationReleaseDAOImpl extends AbstractDAOImpl implements "Error while getting all the release details of the app ID: " + applicationId + ", while executing the query " + sql, e); } finally { - Util.cleanupResources(statement, resultSet); + DAOUtil.cleanupResources(statement, resultSet); } } @@ -342,7 +341,7 @@ public class GenericApplicationReleaseDAOImpl extends AbstractDAOImpl implements resultSet = statement.executeQuery(); while (resultSet.next()) { - ApplicationReleaseDTO appRelease = Util.loadApplicationRelease(resultSet); + ApplicationReleaseDTO appRelease = DAOUtil.loadApplicationRelease(resultSet); applicationReleases.add(appRelease); } return applicationReleases; @@ -354,7 +353,7 @@ public class GenericApplicationReleaseDAOImpl extends AbstractDAOImpl implements "Error while getting all the release details of the app id" + appId + " application" + ", while executing the query " + sql, e); } finally { - Util.cleanupResources(statement, resultSet); + DAOUtil.cleanupResources(statement, resultSet); } } @@ -384,7 +383,7 @@ public class GenericApplicationReleaseDAOImpl extends AbstractDAOImpl implements throw new ApplicationManagementDAOException( "SQL exception while updating the release rating value ,while executing the query " + sql, e); } finally { - Util.cleanupResources(statement, null); + DAOUtil.cleanupResources(statement, null); } } @@ -420,7 +419,7 @@ public class GenericApplicationReleaseDAOImpl extends AbstractDAOImpl implements throw new ApplicationManagementDAOException( "SQL exception while updating the release ,while executing the query " + sql, e); } finally { - Util.cleanupResources(statement, resultSet); + DAOUtil.cleanupResources(statement, resultSet); } } @@ -487,7 +486,7 @@ public class GenericApplicationReleaseDAOImpl extends AbstractDAOImpl implements throw new ApplicationManagementDAOException( "SQL exception while updating the release ,while executing the query " + sql, e); } finally { - Util.cleanupResources(statement, null); + DAOUtil.cleanupResources(statement, null); } return applicationReleaseDTO; } @@ -512,7 +511,7 @@ public class GenericApplicationReleaseDAOImpl extends AbstractDAOImpl implements "SQL exception while deleting the release for release ID: " + id + ",while executing the query sql" , e); } finally { - Util.cleanupResources(statement, null); + DAOUtil.cleanupResources(statement, null); } } @@ -566,7 +565,7 @@ public class GenericApplicationReleaseDAOImpl extends AbstractDAOImpl implements } catch (DBConnectionException e) { throw new ApplicationManagementDAOException("Error occurred while obtaining the DB connection.", e); } finally { - Util.cleanupResources(stmt, rs); + DAOUtil.cleanupResources(stmt, rs); } } @@ -603,7 +602,7 @@ public class GenericApplicationReleaseDAOImpl extends AbstractDAOImpl implements throw new ApplicationManagementDAOException( "Error occurred while obtaining the DB connection to get application release package name.", e); } finally { - Util.cleanupResources(stmt, rs); + DAOUtil.cleanupResources(stmt, rs); } } @@ -640,7 +639,7 @@ public class GenericApplicationReleaseDAOImpl extends AbstractDAOImpl implements } catch (DBConnectionException e) { throw new ApplicationManagementDAOException("Error occurred while obtaining the DB connection.", e); } finally { - Util.cleanupResources(stmt, rs); + DAOUtil.cleanupResources(stmt, rs); } } @@ -674,7 +673,7 @@ public class GenericApplicationReleaseDAOImpl extends AbstractDAOImpl implements } catch (DBConnectionException e) { throw new ApplicationManagementDAOException("Error occurred while obtaining the DB connection.", e); } finally { - Util.cleanupResources(stmt, rs); + DAOUtil.cleanupResources(stmt, rs); } } @@ -721,7 +720,7 @@ public class GenericApplicationReleaseDAOImpl extends AbstractDAOImpl implements } catch (DBConnectionException e) { throw new ApplicationManagementDAOException("Error occurred while obtaining the DB connection.", e); } finally { - Util.cleanupResources(stmt, rs); + DAOUtil.cleanupResources(stmt, rs); } } diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/impl/lifecyclestate/GenericLifecycleStateDAOImpl.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/impl/lifecyclestate/GenericLifecycleStateDAOImpl.java index 73b1951b06f..0673e1cb315 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/impl/lifecyclestate/GenericLifecycleStateDAOImpl.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/impl/lifecyclestate/GenericLifecycleStateDAOImpl.java @@ -24,7 +24,7 @@ import org.wso2.carbon.device.application.mgt.common.AppLifecycleState; import org.wso2.carbon.device.application.mgt.common.LifecycleState; import org.wso2.carbon.device.application.mgt.common.exception.DBConnectionException; import org.wso2.carbon.device.application.mgt.core.dao.LifecycleStateDAO; -import org.wso2.carbon.device.application.mgt.core.dao.common.Util; +import org.wso2.carbon.device.application.mgt.core.util.DAOUtil; import org.wso2.carbon.device.application.mgt.core.dao.impl.AbstractDAOImpl; import org.wso2.carbon.device.application.mgt.core.exception.LifeCycleManagementDAOException; @@ -64,7 +64,7 @@ public class GenericLifecycleStateDAOImpl extends AbstractDAOImpl implements Lif throw new LifeCycleManagementDAOException("Error occurred while obtaining the DB connection to get latest" + " lifecycle state for a specific application", e); } finally { - Util.cleanupResources(stmt, rs); + DAOUtil.cleanupResources(stmt, rs); } } @@ -89,7 +89,7 @@ public class GenericLifecycleStateDAOImpl extends AbstractDAOImpl implements Lif throw new LifeCycleManagementDAOException("Error occurred while obtaining the DB connection to get latest" + " lifecycle state for a specific application", e); } finally { - Util.cleanupResources(stmt, rs); + DAOUtil.cleanupResources(stmt, rs); } } @@ -120,7 +120,7 @@ public class GenericLifecycleStateDAOImpl extends AbstractDAOImpl implements Lif throw new LifeCycleManagementDAOException("Error occurred while obtaining the DB connection to get latest" + " lifecycle state for a specific application", e); } finally { - Util.cleanupResources(stmt, rs); + DAOUtil.cleanupResources(stmt, rs); } } @@ -199,7 +199,7 @@ public class GenericLifecycleStateDAOImpl extends AbstractDAOImpl implements Lif log.error("Error occurred while adding lifecycle: " + state.getCurrentState(), e); throw new LifeCycleManagementDAOException("Error occurred while adding lifecycle: " + state.getCurrentState(), e); } finally { - Util.cleanupResources(stmt, null); + DAOUtil.cleanupResources(stmt, null); } } diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/impl/Review/ReviewDAOImpl.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/impl/review/ReviewDAOImpl.java similarity index 53% rename from components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/impl/Review/ReviewDAOImpl.java rename to components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/impl/review/ReviewDAOImpl.java index c5af36b6d42..9cf963beed6 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/impl/Review/ReviewDAOImpl.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/impl/review/ReviewDAOImpl.java @@ -16,19 +16,21 @@ * under the License. * */ -package org.wso2.carbon.device.application.mgt.core.dao.impl.Review; +package org.wso2.carbon.device.application.mgt.core.dao.impl.review; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.wso2.carbon.device.application.mgt.common.Review; import org.wso2.carbon.device.application.mgt.common.PaginationRequest; +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.exception.DBConnectionException; import org.wso2.carbon.device.application.mgt.core.dao.ReviewDAO; -import org.wso2.carbon.device.application.mgt.core.dao.common.Util; +import org.wso2.carbon.device.application.mgt.core.exception.UnexpectedServerErrorException; +import org.wso2.carbon.device.application.mgt.core.util.DAOUtil; import org.wso2.carbon.device.application.mgt.core.dao.impl.AbstractDAOImpl; import org.wso2.carbon.device.application.mgt.core.exception.ReviewManagementDAOException; +import org.wso2.carbon.device.application.mgt.core.util.Constants; import java.sql.SQLException; import java.sql.ResultSet; @@ -49,206 +51,286 @@ public class ReviewDAOImpl extends AbstractDAOImpl implements ReviewDAO { private String sql; @Override - public boolean addReview(Review review, String uuid, int tenantId) throws ReviewManagementDAOException { + public boolean addReview(ReviewDTO reviewDTO, int appReleaseId, int tenantId) throws ReviewManagementDAOException { if (log.isDebugEnabled()) { - log.debug("Request received in DAO Layer to add review for application release. ApplicationDTO UUID: " + uuid); + log.debug("Request received in DAO Layer to add review for application release. Application Release UUID: " + + appReleaseId); } - PreparedStatement statement = null; - ResultSet rs = null; - sql = "INSERT INTO AP_APP_REVIEW (TENANT_ID, COMMENT, PARENT_ID, RATING, USERNAME,CREATED_AT, MODIFIED_AT, " - + "AP_APP_RELEASE_ID, AP_APP_ID) VALUES (?,?,?,?,?,?,?,(SELECT ID FROM AP_APP_RELEASE WHERE UUID= ?)," - + "(SELECT AP_APP_ID FROM AP_APP_RELEASE WHERE UUID=?));"; + sql = "INSERT INTO AP_APP_REVIEW " + + "(TENANT_ID, " + + "COMMENT, " + + "ROOT_PARENT_ID," + + "IMMEDIATE_PARENT_ID, " + + "RATING, " + + "USERNAME, " + + "CREATED_AT, " + + "MODIFIED_AT, " + + "AP_APP_RELEASE_ID) " + + "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ? )"; try { Calendar calendar = Calendar.getInstance(); Timestamp timestamp = new Timestamp(calendar.getTime().getTime()); Connection conn = this.getDBConnection(); - statement = conn.prepareStatement(sql, new String[] { "id" }); - statement.setInt(1, tenantId); - statement.setString(2, review.getComment()); - statement.setInt(3, review.getParentId()); - statement.setInt(4, review.getRating()); - statement.setString(5, review.getUsername()); - statement.setTimestamp(6, timestamp); - statement.setTimestamp(7,timestamp); - statement.setString(8,uuid); - statement.setString(9,uuid); - statement.executeUpdate(); - rs = statement.getGeneratedKeys(); - return rs.next(); - } - catch (DBConnectionException e) { + try (PreparedStatement statement = conn.prepareStatement(sql, new String[] { "id" });) { + statement.setInt(1, tenantId); + statement.setString(2, reviewDTO.getContent()); + statement.setInt(3, reviewDTO.getRootParentId()); + statement.setInt(4, reviewDTO.getImmediateParentId()); + statement.setInt(5, reviewDTO.getRating()); + statement.setString(6, reviewDTO.getUsername()); + statement.setTimestamp(7, timestamp); + statement.setTimestamp(8, timestamp); + statement.setInt(9, appReleaseId); + statement.executeUpdate(); + try (ResultSet rs = statement.getGeneratedKeys()) { + return rs.next(); + } + } + } catch (DBConnectionException e) { throw new ReviewManagementDAOException("Error occurred while obtaining the DB connection while " - + "adding review for application UUID: "+ "Tenant Id: " + tenantId, e); - }catch (SQLException e) { - throw new ReviewManagementDAOException("Error occurred while getting application list for the tenant" - + " " + tenantId + ". While executing " + sql, e); - } finally { - Util.cleanupResources(statement, rs); + + "adding review for application release which has ID: "+ appReleaseId + "Tenant Id: " + tenantId, e); + } catch (SQLException e) { + throw new ReviewManagementDAOException( + "Error occurred while executing SQL statement to add application review. Application ID: " + + appReleaseId + " tenant " + tenantId, e); } } @Override - public Review haveUerCommented(String uuid, String username, int tenantId) throws ReviewManagementDAOException { + public boolean haveUerReviewed(int appReleaseId, String username, int tenantId) throws ReviewManagementDAOException { if (log.isDebugEnabled()) { - log.debug( - "Request received in DAO Layer to check whether user have already commented or not for the " - + "application release. ApplicationDTO UUID: " + uuid + " comment owner: " + username + - " tenant-id " + tenantId); + log.debug("Request received in DAO Layer to check whether user have already reviewed or not for the " + + "application release. Commenting user: " + username + " and tenant-id: " + tenantId); } Connection conn; - PreparedStatement statement = null; - ResultSet rs = null; - Review review = null; - sql = "SELECT ID, COMMENT, CREATED_AT, MODIFIED_AT, USERNAME, PARENT_ID, RATING FROM AP_APP_REVIEW WHERE " - + "AP_APP_RELEASE_ID = (SELECT ID FROM AP_APP_RELEASE WHERE UUID=?) AND USERNAME = ? AND TENANT_ID = ?;"; + sql = "SELECT " + + "rv.ID " + + "FROM AP_APP_REVIEW rv " + + "WHERE " + + "rv.AP_APP_RELEASE_ID = ? AND " + + "rv.USERNAME = ? AND " + + "rv.TENANT_ID = ?"; try { conn = this.getDBConnection(); - statement = conn.prepareStatement(sql); - statement.setString(1, uuid); - statement.setString(2, username); - statement.setInt(3, tenantId); - rs = statement.executeQuery(); - if (rs.next()){ - review = new Review(); - review.setId(rs.getInt("ID")); - review.setComment(rs.getString("COMMENT")); - review.setParentId(rs.getInt("PARENT_ID")); - review.setCreatedAt(rs.getTimestamp("CREATED_AT")); - review.setModifiedAt(rs.getTimestamp("MODIFIED_AT")); - review.setUsername(rs.getString("USERNAME")); - review.setRating(rs.getInt("RATING")); + try (PreparedStatement statement = conn.prepareStatement(sql)) { + statement.setInt(1, appReleaseId); + statement.setString(2, username); + statement.setInt(3, tenantId); + try (ResultSet rs = statement.executeQuery()) { + return rs.next(); + + } } - return review; } catch (SQLException e) { throw new ReviewManagementDAOException("Error occured while accessing the Database when checking whether " + "user has already commented for the application ro not", e); } catch (DBConnectionException e) { throw new ReviewManagementDAOException("Error occured while getting the database connection when checking " + "whether user has already commented for the application ro not", e); - - } finally { - Util.cleanupResources(statement, rs); } } @Override - public int updateReview(Review review, int reviewId, String username, int tenantId) + public int updateReview(ReviewDTO reviewDTO, int reviewId, int tenantId) throws ReviewManagementDAOException { if (log.isDebugEnabled()) { - log.debug("Request received in DAO Layer to update the comment with ID (" + reviewId + ")"); + log.debug("Request received in DAO Layer to update the Review with ID (" + reviewId + ")"); } Connection connection; PreparedStatement statement = null; ResultSet rs = null; - sql = "UPDATE AP_APP_REVIEW SET COMMENT=?, RATING=?, MODIFIED_AT=? WHERE ID=? AND USERNAME=? AND TENANT_ID=?;"; + sql = "UPDATE " + + "AP_APP_REVIEW " + + "SET " + + "COMMENT = ?, " + + "RATING = ?, " + + "MODIFIED_AT = ? " + + "WHERE ID = ? AND " + + "TENANT_ID = ?"; try { Calendar calendar = Calendar.getInstance(); Timestamp timestamp = new Timestamp(calendar.getTime().getTime()); connection = this.getDBConnection(); statement = connection.prepareStatement(sql); - statement.setString(1, review.getComment()); - statement.setInt(2, review.getRating()); + statement.setString(1, reviewDTO.getContent()); + statement.setInt(2, reviewDTO.getRating()); statement.setTimestamp(3, timestamp); statement.setInt(4, reviewId); - statement.setString(5, username); - statement.setInt(6, tenantId); + statement.setInt(5, tenantId); return statement.executeUpdate(); } catch (SQLException e) { - throw new ReviewManagementDAOException("Error occurred while executing review updating query"); + throw new ReviewManagementDAOException("Error occurred while executing reviewTmp updating query"); } catch (DBConnectionException e) { - throw new ReviewManagementDAOException("Error occured while getting the db connection to update review"); + throw new ReviewManagementDAOException("Error occured while getting the db connection to update reviewTmp"); } finally { - Util.cleanupResources(statement, rs); + DAOUtil.cleanupResources(statement, rs); } } @Override - public Review getReview(int reviewId) throws ReviewManagementDAOException { + public ReviewDTO getReview(int reviewId) throws ReviewManagementDAOException { if (log.isDebugEnabled()) { - log.debug("Getting review with the review id(" + reviewId + ") from the database"); + log.debug("Getting reviewDTO with the review id(" + reviewId + ") from the database"); } Connection conn; PreparedStatement statement = null; ResultSet rs = null; - Review review = null; try { conn = this.getDBConnection(); - sql = "SELECT ID, COMMENT, CREATED_AT, MODIFIED_AT, RATING, USERNAME FROM AP_APP_REVIEW WHERE ID=?;"; + sql = "SELECT " + + "ID, " + + "COMMENT," + + "ROOT_PARENT_ID," + + "IMMEDIATE_PARENT_ID, " + + "CREATED_AT, " + + "MODIFIED_AT, " + + "RATING, " + + "USERNAME " + + "FROM AP_APP_REVIEW " + + "WHERE ID = ?"; statement = conn.prepareStatement(sql); statement.setInt(1, reviewId); rs = statement.executeQuery(); - if (rs.next()) { - review = new Review(); - review.setId(rs.getInt("ID")); - review.setComment(rs.getString("COMMENT")); - review.setCreatedAt(rs.getTimestamp("CREATED_AT")); - review.setModifiedAt(rs.getTimestamp("MODIFIED_AT")); - review.setRating(rs.getInt("RATING")); - review.setUsername(rs.getString("USERNAME")); - return review; - } + return DAOUtil.loadReview(rs); } catch (SQLException e) { throw new ReviewManagementDAOException( - "SQL Error occurred while retrieving information of the review " + reviewId, e); + "SQL Error occurred while retrieving information of the reviewTmp " + reviewId, e); } catch (DBConnectionException e) { throw new ReviewManagementDAOException( - "DB Connection Exception occurred while retrieving information of the review " + reviewId, e); + "DB Connection Exception occurred while retrieving information of the reviewTmp " + reviewId, e); + } catch (UnexpectedServerErrorException e) { + throw new ReviewManagementDAOException("Found more than one review for review ID: " + reviewId, e); } finally { - Util.cleanupResources(statement, rs); + DAOUtil.cleanupResources(statement, rs); } - return review; } @Override - public List getAllReviews(String uuid, PaginationRequest request, int tenantId) - throws ReviewManagementDAOException { - + public ReviewDTO getReview(int appReleaseId, int reviewId) throws ReviewManagementDAOException { if (log.isDebugEnabled()) { - log.debug("Getting comment of the application release (" + uuid + ") from the database"); + log.debug("Getting reviewDTO with the review id(" + reviewId + ") from the database"); } Connection conn; PreparedStatement statement = null; ResultSet rs = null; - List reviews = new ArrayList<>(); try { conn = this.getDBConnection(); - sql = "SELECT AP_APP_REVIEW.ID AS ID, AP_APP_REVIEW.COMMENT AS COMMENT, " - + "AP_APP_REVIEW.CREATED_AT AS CREATED_AT, AP_APP_REVIEW.MODIFIED_AT AS MODIFIED_AT, " - + "AP_APP_REVIEW.USERNAME AS USERNAME, AP_APP_REVIEW.PARENT_ID AS PARENT_ID, " - + "AP_APP_REVIEW.RATING AS RATING FROM AP_APP_REVIEW, AP_APP_RELEASE WHERE " - + "AP_APP_REVIEW.AP_APP_RELEASE_ID=AP_APP_RELEASE.ID AND AP_APP_RELEASE.UUID =? " - + "AND AP_APP_REVIEW.TENANT_ID = ? AND " - + "AP_APP_REVIEW.TENANT_ID = AP_APP_RELEASE.TENANT_ID LIMIT ? OFFSET ?;"; + sql = "SELECT " + + "ID, " + + "COMMENT," + + "ROOT_PARENT_ID," + + "IMMEDIATE_PARENT_ID, " + + "CREATED_AT, " + + "MODIFIED_AT, " + + "RATING, " + + "USERNAME " + + "FROM AP_APP_REVIEW " + + "WHERE ID = ? AND " + + "AP_APP_RELEASE_ID = ?"; statement = conn.prepareStatement(sql); - statement.setString(1, uuid); - statement.setInt(2, tenantId); - statement.setInt(3, request.getLimit()); - statement.setInt(4, request.getOffSet()); + statement.setInt(1, reviewId); + statement.setInt(2, appReleaseId); rs = statement.executeQuery(); - while (rs.next()) { - Review review = new Review(); - review.setId(rs.getInt("ID")); - review.setComment(rs.getString("COMMENT")); - review.setCreatedAt(rs.getTimestamp("CREATED_AT")); - review.setModifiedAt(rs.getTimestamp("MODIFIED_AT")); - review.setParentId(rs.getInt("PARENT_ID")); - review.setUsername(rs.getString("USERNAME")); - review.setRating(rs.getInt("RATING")); - reviews.add(review); + return DAOUtil.loadReview(rs); + } catch (SQLException e) { + throw new ReviewManagementDAOException( + "SQL Error occurred while retrieving information of the reviewTmp " + reviewId, e); + } catch (DBConnectionException e) { + throw new ReviewManagementDAOException( + "DB Connection Exception occurred while retrieving information of the reviewTmp " + reviewId, e); + } catch (UnexpectedServerErrorException e) { + throw new ReviewManagementDAOException("Found more than one review for review ID: " + reviewId, e); + } finally { + DAOUtil.cleanupResources(statement, rs); + } + } + + + @Override + public List getAllReviews(int releaseId, PaginationRequest request, int tenantId) + throws ReviewManagementDAOException { + + if (log.isDebugEnabled()) { + log.debug("Getting comment of the application release (" + releaseId + ") from the database"); + } + Connection conn; + List reviewDTOs = new ArrayList<>(); + try { + conn = this.getDBConnection(); + sql = "SELECT " + + "AP_APP_REVIEW.ID AS ID, " + + "AP_APP_REVIEW.COMMENT AS COMMENT, " + + "AP_APP_REVIEW.CREATED_AT AS CREATED_AT, " + + "AP_APP_REVIEW.MODIFIED_AT AS MODIFIED_AT, " + + "AP_APP_REVIEW.USERNAME AS USERNAME, " + + "AP_APP_REVIEW.ROOT_PARENT_ID AS ROOT_PARENT_ID, " + + "AP_APP_REVIEW.IMMEDIATE_PARENT_ID AS IMMEDIATE_PARENT_ID, " + + "AP_APP_REVIEW.RATING AS RATING " + + "FROM AP_APP_REVIEW " + + "WHERE " + + "AP_APP_REVIEW.AP_APP_RELEASE_ID = ? AND " + + "AP_APP_REVIEW.ROOT_PARENT_ID = ? AND " + + "AP_APP_REVIEW.TENANT_ID = ? " + + "LIMIT ? OFFSET ?"; + try (PreparedStatement statement = conn.prepareStatement(sql)) { + statement.setInt(1, releaseId); + statement.setInt(2, Constants.REVIEW_PARENT_ID); + statement.setInt(3, tenantId); + statement.setInt(4, request.getLimit()); + statement.setInt(5, request.getOffSet()); + try (ResultSet rs = statement.executeQuery()) { + reviewDTOs = DAOUtil.loadReviews(rs); + } } - } catch (DBConnectionException e) { + } catch (DBConnectionException e) { throw new ReviewManagementDAOException( "Error occurred while obtaining the DB connection when verifying application existence", e); } catch (SQLException e) { - throw new ReviewManagementDAOException("DB connection error occurred while getting all reviews", e); - }finally { - Util.cleanupResources(statement, rs); + throw new ReviewManagementDAOException("DB connection error occurred while getting all reviewTmps", e); + } return reviewDTOs; + } + + @Override + public List getReplyComments(int parentId, int tenantId) throws ReviewManagementDAOException { + + if (log.isDebugEnabled()) { + log.debug("Getting comment of the application release (" + parentId + ") from the database"); } - return reviews; + Connection conn; + List reviewDTOs; + try { + conn = this.getDBConnection(); + sql = "SELECT " + + "AP_APP_REVIEW.ID AS ID, " + + "AP_APP_REVIEW.COMMENT AS COMMENT, " + + "AP_APP_REVIEW.CREATED_AT AS CREATED_AT, " + + "AP_APP_REVIEW.MODIFIED_AT AS MODIFIED_AT, " + + "AP_APP_REVIEW.USERNAME AS USERNAME, " + + "AP_APP_REVIEW.ROOT_PARENT_ID AS ROOT_PARENT_ID, " + + "AP_APP_REVIEW.IMMEDIATE_PARENT_ID AS IMMEDIATE_PARENT_ID, " + + "AP_APP_REVIEW.RATING AS RATING " + + "FROM AP_APP_REVIEW " + + "WHERE " + + "AP_APP_REVIEW.ROOT_PARENT_ID = ? AND " + + "AP_APP_REVIEW.TENANT_ID = ?"; + try (PreparedStatement statement = conn.prepareStatement(sql)) { + statement.setInt(1, parentId); + statement.setInt(2, tenantId); + try (ResultSet rs = statement.executeQuery();) { + reviewDTOs = DAOUtil.loadReviews(rs); + } + } + } catch (DBConnectionException e) { + throw new ReviewManagementDAOException( + "Error occurred while obtaining the DB connection when getting reply comments for a review.", e); + } catch (SQLException e) { + throw new ReviewManagementDAOException("DB connection error occurred while getting reply comments", e); + } + return reviewDTOs; } @Override @@ -282,7 +364,7 @@ public class ReviewDAOImpl extends AbstractDAOImpl implements ReviewDAO { "Error occured while getting DB connection to retrieve all rating values for the application release. App release UUID: " + uuid, e); } finally { - Util.cleanupResources(statement, rs); + DAOUtil.cleanupResources(statement, rs); } return reviews; } @@ -316,7 +398,7 @@ public class ReviewDAOImpl extends AbstractDAOImpl implements ReviewDAO { } catch (DBConnectionException e) { throw new ReviewManagementDAOException("DB Connection Exception occurred while retrieving review counts", e); } finally { - Util.cleanupResources(statement, rs); + DAOUtil.cleanupResources(statement, rs); } return commentCount; } @@ -345,7 +427,7 @@ public class ReviewDAOImpl extends AbstractDAOImpl implements ReviewDAO { commentCount = rs.getInt("COMMENT_COUNT"); } } finally { - Util.cleanupResources(statement, rs); + DAOUtil.cleanupResources(statement, rs); } return commentCount; } @@ -367,7 +449,7 @@ public class ReviewDAOImpl extends AbstractDAOImpl implements ReviewDAO { throw new ReviewManagementDAOException("Error occured while getting the database connection", e); } finally { - Util.cleanupResources(statement, null); + DAOUtil.cleanupResources(statement, null); } } @@ -395,7 +477,7 @@ public class ReviewDAOImpl extends AbstractDAOImpl implements ReviewDAO { } catch (SQLException e) { throw new ReviewManagementException("SQL Error occurred while deleting comments", e); } finally { - Util.cleanupResources(statement, null); + DAOUtil.cleanupResources(statement, null); } } } diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/impl/subscription/GenericSubscriptionDAOImpl.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/impl/subscription/GenericSubscriptionDAOImpl.java index 7eeb71046c6..b59ca1f7b23 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/impl/subscription/GenericSubscriptionDAOImpl.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/impl/subscription/GenericSubscriptionDAOImpl.java @@ -19,15 +19,12 @@ package org.wso2.carbon.device.application.mgt.core.dao.impl.subscription; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.json.JSONException; -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.exception.DBConnectionException; import org.wso2.carbon.device.application.mgt.core.dao.SubscriptionDAO; -import org.wso2.carbon.device.application.mgt.core.dao.common.Util; +import org.wso2.carbon.device.application.mgt.core.util.DAOUtil; import org.wso2.carbon.device.application.mgt.core.dao.impl.AbstractDAOImpl; import org.wso2.carbon.device.application.mgt.core.exception.ApplicationManagementDAOException; -import org.wso2.carbon.device.application.mgt.core.exception.UnexpectedServerErrorException; import org.wso2.carbon.device.mgt.common.Device; import org.wso2.carbon.device.mgt.common.group.mgt.DeviceGroup; @@ -70,7 +67,7 @@ public class GenericSubscriptionDAOImpl extends AbstractDAOImpl implements Subsc throw new ApplicationManagementDAOException("Error occurred while adding device application mapping to DB", e); } finally { - Util.cleanupResources(stmt, null); + DAOUtil.cleanupResources(stmt, null); } } @@ -104,7 +101,7 @@ public class GenericSubscriptionDAOImpl extends AbstractDAOImpl implements Subsc throw new ApplicationManagementDAOException("Error occurred while adding device application mapping to DB", e); } finally { - Util.cleanupResources(stmt, null); + DAOUtil.cleanupResources(stmt, null); } } @@ -137,7 +134,7 @@ public class GenericSubscriptionDAOImpl extends AbstractDAOImpl implements Subsc throw new ApplicationManagementDAOException("Error occurred while adding device application mapping to DB", e); } finally { - Util.cleanupResources(stmt, null); + DAOUtil.cleanupResources(stmt, null); } } @@ -170,7 +167,7 @@ public class GenericSubscriptionDAOImpl extends AbstractDAOImpl implements Subsc throw new ApplicationManagementDAOException("Error occurred while adding device application mapping to DB", e); } finally { - Util.cleanupResources(stmt, null); + DAOUtil.cleanupResources(stmt, null); } } @@ -203,7 +200,7 @@ public class GenericSubscriptionDAOImpl extends AbstractDAOImpl implements Subsc log.debug("Successfully retrieved device subscriptions for application release id " + appReleaseId); } - return Util.loadDeviceSubscriptions(rs); + return DAOUtil.loadDeviceSubscriptions(rs); } } } catch (SQLException e) { diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/impl/visibility/GenericVisibilityDAOImpl.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/impl/visibility/GenericVisibilityDAOImpl.java index 26f88165b05..c37949dbf3c 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/impl/visibility/GenericVisibilityDAOImpl.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/impl/visibility/GenericVisibilityDAOImpl.java @@ -21,7 +21,7 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.wso2.carbon.device.application.mgt.common.exception.DBConnectionException; import org.wso2.carbon.device.application.mgt.core.dao.VisibilityDAO; -import org.wso2.carbon.device.application.mgt.core.dao.common.Util; +import org.wso2.carbon.device.application.mgt.core.util.DAOUtil; import org.wso2.carbon.device.application.mgt.core.dao.impl.AbstractDAOImpl; import org.wso2.carbon.device.application.mgt.core.exception.VisibilityManagementDAOException; @@ -66,7 +66,7 @@ public class GenericVisibilityDAOImpl extends AbstractDAOImpl implements Visibil }catch (SQLException e) { throw new VisibilityManagementDAOException("Error occurred while adding unrestricted roles", e); } finally { - Util.cleanupResources(stmt, rs); + DAOUtil.cleanupResources(stmt, rs); } } @@ -100,7 +100,7 @@ public class GenericVisibilityDAOImpl extends AbstractDAOImpl implements Visibil }catch (SQLException e) { throw new VisibilityManagementDAOException("Error occurred while adding unrestricted roles", e); } finally { - Util.cleanupResources(stmt, rs); + DAOUtil.cleanupResources(stmt, rs); } } @@ -167,7 +167,7 @@ public class GenericVisibilityDAOImpl extends AbstractDAOImpl implements Visibil }catch (SQLException e) { throw new VisibilityManagementDAOException("Error occurred while adding unrestricted roles", e); } finally { - Util.cleanupResources(stmt, rs); + DAOUtil.cleanupResources(stmt, rs); } } } diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/exception/ApplicationManagementDAOException.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/exception/ApplicationManagementDAOException.java index ccadcab072d..d946ee3fcee 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/exception/ApplicationManagementDAOException.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/exception/ApplicationManagementDAOException.java @@ -16,8 +16,6 @@ */ package org.wso2.carbon.device.application.mgt.core.exception; -import org.wso2.carbon.device.application.mgt.common.exception.ApplicationManagementException; - /** * Exception thrown during the ApplicationDTO Management DAO operations. */ diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/exception/ReviewManagementDAOException.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/exception/ReviewManagementDAOException.java index f32f08b3244..56cb3ff3bac 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/exception/ReviewManagementDAOException.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/exception/ReviewManagementDAOException.java @@ -21,7 +21,7 @@ package org.wso2.carbon.device.application.mgt.core.exception; import org.wso2.carbon.device.application.mgt.common.exception.ReviewManagementException; /** - * Exception thrown during the Review Management DAO operations. + * Exception thrown during the ReviewTmp Management DAO operations. */ public class ReviewManagementDAOException extends ReviewManagementException { diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/impl/ApplicationManagerImpl.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/impl/ApplicationManagerImpl.java index c29040d809c..010d9a565e8 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/impl/ApplicationManagerImpl.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/impl/ApplicationManagerImpl.java @@ -65,7 +65,7 @@ import org.wso2.carbon.device.application.mgt.core.dao.LifecycleStateDAO; import org.wso2.carbon.device.application.mgt.core.dao.SubscriptionDAO; import org.wso2.carbon.device.application.mgt.core.dao.VisibilityDAO; import org.wso2.carbon.device.application.mgt.core.dao.common.ApplicationManagementDAOFactory; -import org.wso2.carbon.device.application.mgt.core.dao.common.Util; +import org.wso2.carbon.device.application.mgt.core.util.DAOUtil; import org.wso2.carbon.device.application.mgt.core.exception.ApplicationManagementDAOException; import org.wso2.carbon.device.application.mgt.core.exception.BadRequestException; import org.wso2.carbon.device.application.mgt.core.exception.ForbiddenException; @@ -251,7 +251,7 @@ public class ApplicationManagerImpl implements ApplicationManager { } //insert application data into databse - ApplicationStorageManager applicationStorageManager = Util.getApplicationStorageManager(); + ApplicationStorageManager applicationStorageManager = DAOUtil.getApplicationStorageManager(); ApplicationReleaseDTO applicationReleaseDTO = applicationDTO.getApplicationReleaseDTOs().get(0); try { List applicationReleaseEntities = new ArrayList<>(); @@ -379,7 +379,7 @@ public class ApplicationManagerImpl implements ApplicationManager { } private void deleteApplicationArtifacts(List directoryPaths) throws ApplicationManagementException { - ApplicationStorageManager applicationStorageManager = Util.getApplicationStorageManager(); + ApplicationStorageManager applicationStorageManager = DAOUtil.getApplicationStorageManager(); try { applicationStorageManager.deleteAllApplicationReleaseArtifacts(directoryPaths); @@ -395,7 +395,7 @@ public class ApplicationManagerImpl implements ApplicationManager { ApplicationReleaseDTO applicationReleaseDTO, ApplicationArtifact applicationArtifact, boolean isNewRelease) throws ResourceManagementException, ApplicationManagementException { int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true); - ApplicationStorageManager applicationStorageManager = Util.getApplicationStorageManager(); + ApplicationStorageManager applicationStorageManager = DAOUtil.getApplicationStorageManager(); String uuid = UUID.randomUUID().toString(); applicationReleaseDTO.setUuid(uuid); @@ -478,7 +478,7 @@ public class ApplicationManagerImpl implements ApplicationManager { ApplicationReleaseDTO applicationReleaseDTO, ApplicationArtifact applicationArtifact) throws ResourceManagementException, ApplicationManagementException { int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true); - ApplicationStorageManager applicationStorageManager = Util.getApplicationStorageManager(); + ApplicationStorageManager applicationStorageManager = DAOUtil.getApplicationStorageManager(); // The application executable artifacts such as apks are uploaded. if (ApplicationType.ENTERPRISE.toString().equals(applicationType)) { @@ -562,7 +562,7 @@ public class ApplicationManagerImpl implements ApplicationManager { private ApplicationReleaseDTO addImageArtifacts(ApplicationReleaseDTO applicationReleaseDTO, ApplicationArtifact applicationArtifact) throws ResourceManagementException { - ApplicationStorageManager applicationStorageManager = Util.getApplicationStorageManager(); + ApplicationStorageManager applicationStorageManager = DAOUtil.getApplicationStorageManager(); applicationReleaseDTO.setIconName(applicationArtifact.getIconName()); applicationReleaseDTO.setBannerName(applicationArtifact.getBannerName()); @@ -591,7 +591,7 @@ public class ApplicationManagerImpl implements ApplicationManager { private ApplicationReleaseDTO updateImageArtifacts(ApplicationReleaseDTO applicationReleaseDTO, ApplicationArtifact applicationArtifact) throws ResourceManagementException{ - ApplicationStorageManager applicationStorageManager = Util.getApplicationStorageManager(); + ApplicationStorageManager applicationStorageManager = DAOUtil.getApplicationStorageManager(); applicationStorageManager.deleteImageArtifacts(applicationReleaseDTO); @@ -1193,7 +1193,7 @@ public class ApplicationManagerImpl implements ApplicationManager { + applicationId); } int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true); - ApplicationStorageManager applicationStorageManager = Util.getApplicationStorageManager(); + ApplicationStorageManager applicationStorageManager = DAOUtil.getApplicationStorageManager(); ApplicationDTO applicationDTO = getApplication(applicationId); List applicationReleaseDTOs = applicationDTO.getApplicationReleaseDTOs(); for (ApplicationReleaseDTO applicationReleaseDTO : applicationReleaseDTOs) { @@ -1334,7 +1334,7 @@ public class ApplicationManagerImpl implements ApplicationManager { public void deleteApplicationRelease(String releaseUuid) throws ApplicationManagementException { int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true); - ApplicationStorageManager applicationStorageManager = Util.getApplicationStorageManager(); + ApplicationStorageManager applicationStorageManager = DAOUtil.getApplicationStorageManager(); try { ConnectionManagerUtil.beginDBTransaction(); ApplicationReleaseDTO applicationReleaseDTO = this.applicationReleaseDAO @@ -1477,7 +1477,7 @@ public class ApplicationManagerImpl implements ApplicationManager { boolean isValidDeviceType = false; List deviceTypes; try { - deviceTypes = Util.getDeviceManagementService().getDeviceTypes(); + deviceTypes = DAOUtil.getDeviceManagementService().getDeviceTypes(); for (DeviceType dt : deviceTypes) { if (dt.getName().equals(deviceType)) { @@ -1618,7 +1618,7 @@ public class ApplicationManagerImpl implements ApplicationManager { } @Override - public void changeLifecycleState(String releaseUuid, LifecycleChanger lifecycleChanger) + public ApplicationRelease changeLifecycleState(String releaseUuid, LifecycleChanger lifecycleChanger) throws ApplicationManagementException { int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true); @@ -1664,6 +1664,7 @@ public class ApplicationManagerImpl implements ApplicationManager { } this.lifecycleStateDAO.addLifecycleState(lifecycleState, applicationReleaseDTO.getId(), tenantId); ConnectionManagerUtil.commitDBTransaction(); + return releaseDtoToRelease(applicationReleaseDTO); } else { String msg = "Invalid lifecycle state transition from '" + applicationReleaseDTO.getCurrentState() + "'" + " to '" + lifecycleChanger.getAction() + "'"; @@ -2397,6 +2398,11 @@ public class ApplicationManagerImpl implements ApplicationManager { log.error(msg); throw new RequestValidatingException(msg); } + if (applicationWrapper.getAppCategories() == null) { + String msg = "Application category can't be null."; + log.error(msg); + throw new RequestValidatingException(msg); + } if (applicationWrapper.getAppCategories().isEmpty()) { String msg = "Application category can't be empty."; log.error(msg); @@ -2595,7 +2601,7 @@ public class ApplicationManagerImpl implements ApplicationManager { throws BadRequestException, UnexpectedServerErrorException { List deviceTypes; try { - deviceTypes = Util.getDeviceManagementService().getDeviceTypes(); + deviceTypes = DAOUtil.getDeviceManagementService().getDeviceTypes(); if(deviceTypeAttr instanceof String){ for (DeviceType dt : deviceTypes) { diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/impl/AppmDataHandlerImpl.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/impl/AppmDataHandlerImpl.java index 71570221afb..9f0ac6c8d23 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/impl/AppmDataHandlerImpl.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/impl/AppmDataHandlerImpl.java @@ -29,7 +29,7 @@ import org.wso2.carbon.device.application.mgt.common.services.AppmDataHandler; import org.wso2.carbon.device.application.mgt.common.config.UIConfiguration; import org.wso2.carbon.device.application.mgt.core.dao.ApplicationReleaseDAO; import org.wso2.carbon.device.application.mgt.core.dao.common.ApplicationManagementDAOFactory; -import org.wso2.carbon.device.application.mgt.core.dao.common.Util; +import org.wso2.carbon.device.application.mgt.core.util.DAOUtil; import org.wso2.carbon.device.application.mgt.core.exception.ApplicationManagementDAOException; import org.wso2.carbon.device.application.mgt.core.exception.NotFoundException; import org.wso2.carbon.device.application.mgt.core.internal.DataHolder; @@ -67,7 +67,7 @@ public class AppmDataHandlerImpl implements AppmDataHandler { @Override public InputStream getArtifactStream(String uuid, String artifactName) throws ApplicationManagementException { int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true); - ApplicationStorageManager applicationStorageManager = Util.getApplicationStorageManager(); + ApplicationStorageManager applicationStorageManager = DAOUtil.getApplicationStorageManager(); ApplicationReleaseDAO applicationReleaseDAO = ApplicationManagementDAOFactory.getApplicationReleaseDAO(); String artifactPath; String appReleaseHashValue; diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/impl/ReviewManagerImpl.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/impl/ReviewManagerImpl.java index ed50b02407a..5397ccee698 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/impl/ReviewManagerImpl.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/impl/ReviewManagerImpl.java @@ -22,17 +22,25 @@ import org.apache.commons.logging.LogFactory; import org.wso2.carbon.CarbonConstants; import org.wso2.carbon.context.PrivilegedCarbonContext; import org.wso2.carbon.device.application.mgt.common.Rating; -import org.wso2.carbon.device.application.mgt.common.Review; +import org.wso2.carbon.device.application.mgt.common.ReviewNode; import org.wso2.carbon.device.application.mgt.common.PaginationRequest; import org.wso2.carbon.device.application.mgt.common.PaginationResult; +import org.wso2.carbon.device.application.mgt.common.dto.ApplicationReleaseDTO; +import org.wso2.carbon.device.application.mgt.common.dto.ReviewDTO; +import org.wso2.carbon.device.application.mgt.common.exception.ApplicationManagementException; import org.wso2.carbon.device.application.mgt.common.exception.ReviewDoesNotExistException; import org.wso2.carbon.device.application.mgt.common.exception.ReviewManagementException; import org.wso2.carbon.device.application.mgt.common.exception.DBConnectionException; +import org.wso2.carbon.device.application.mgt.common.exception.TransactionManagementException; +import org.wso2.carbon.device.application.mgt.common.response.Review; import org.wso2.carbon.device.application.mgt.common.services.*; +import org.wso2.carbon.device.application.mgt.common.wrapper.ReviewWrapper; import org.wso2.carbon.device.application.mgt.core.dao.ApplicationReleaseDAO; import org.wso2.carbon.device.application.mgt.core.dao.ReviewDAO; import org.wso2.carbon.device.application.mgt.core.dao.common.ApplicationManagementDAOFactory; import org.wso2.carbon.device.application.mgt.core.exception.ApplicationManagementDAOException; +import org.wso2.carbon.device.application.mgt.core.exception.BadRequestException; +import org.wso2.carbon.device.application.mgt.core.exception.ForbiddenException; import org.wso2.carbon.device.application.mgt.core.exception.NotFoundException; import org.wso2.carbon.device.application.mgt.core.exception.ReviewManagementDAOException; import org.wso2.carbon.device.application.mgt.core.internal.DataHolder; @@ -42,6 +50,7 @@ import org.wso2.carbon.user.api.UserStoreException; import org.wso2.carbon.utils.multitenancy.MultitenantUtils; import java.util.ArrayList; +import java.util.Comparator; import java.util.List; import java.util.TreeMap; @@ -64,34 +73,124 @@ public class ReviewManagerImpl implements ReviewManager { } @Override - public boolean addReview(Review review, String uuid) throws ReviewManagementException, NotFoundException { + public boolean addReview(ReviewWrapper reviewWrapper, String uuid) + throws ReviewManagementException, ApplicationManagementException { int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true); String username = PrivilegedCarbonContext.getThreadLocalCarbonContext().getUsername(); - boolean isSuccess = false; + + if (reviewWrapper == null) { + String msg = "Request payload is null. Please verify the request payload."; + log.error(msg); + throw new BadRequestException(msg); + } + if (reviewWrapper.getRating() < 0) { + String msg = "You are trying to add invalid rating value as rating. Therefore please verify the request " + + "payload."; + log.error(msg); + throw new ForbiddenException(msg); + } try { - ConnectionManagerUtil.openDBConnection(); - if (!this.applicationReleaseDAO.verifyReleaseExistenceByUuid(uuid, tenantId)){ - throw new NotFoundException("Couldn't find application release for the application UUID: " + uuid); + ConnectionManagerUtil.beginDBTransaction(); + ApplicationReleaseDTO applicationReleaseDTO = this.applicationReleaseDAO.getReleaseByUUID(uuid, tenantId); + if (applicationReleaseDTO == null) { + String msg = "Couldn't find application release for the application UUID: " + uuid; + log.error(msg); + throw new NotFoundException(msg); } - Review existingReview = this.reviewDAO.haveUerCommented(uuid, username, tenantId); - if (existingReview != null && isAuthorizedUser(username, existingReview.getUsername(), tenantId) - && review.getRating() > 0 && review.getRating() != existingReview.getRating()) { - Runnable task = () -> calculateRating(review.getRating(), existingReview.getRating(), uuid, tenantId); - new Thread(task).start(); - isSuccess = updateReview(review, existingReview.getId(), uuid, existingReview); - } else if (review.getRating() > 0) { - Runnable task = () -> calculateRating(review.getRating(), -12345, uuid, tenantId); - new Thread(task).start(); - review.setUsername(username); - isSuccess = this.reviewDAO.addReview(review, uuid, tenantId); + if (this.reviewDAO.haveUerReviewed(applicationReleaseDTO.getId(), username, tenantId)) { + String msg = + "User " + username + " has already reviewed the application release which has UUID: " + uuid + + ". Hence you can't add another review for same application release. But you can update " + + "the review that you have already added for ths application release."; + log.error(msg); + throw new ForbiddenException(msg); + } + Runnable task = () -> calculateRating(reviewWrapper.getRating(), -12345, uuid, tenantId); + new Thread(task).start(); + + ReviewDTO reviewDTO = reviewWrapperToDO(reviewWrapper); + reviewDTO.setUsername(username); + reviewDTO.setRootParentId(-1); + reviewDTO.setImmediateParentId(-1); + if (this.reviewDAO.addReview(reviewDTO, applicationReleaseDTO.getId(), tenantId)) { + ConnectionManagerUtil.commitDBTransaction(); + return true; + } + ConnectionManagerUtil.rollbackDBTransaction(); + return false; + } catch (DBConnectionException e) { + String msg = "DB Connection error occurs when adding Review for application release with UUID: " + uuid + + " is failed"; + log.error(msg); + throw new ReviewManagementException(msg, e); + } catch (TransactionManagementException e) { + String msg = "DB transaction error occurred when adding review for application release which has " + + "application UUID: " + uuid; + log.error(msg); + throw new ReviewManagementException(msg, e); + } catch (ApplicationManagementDAOException e) { + String msg = "Error occurred when getting application release data for application release UUID:." + uuid; + log.error(msg); + throw new ReviewManagementException(msg, e); + } catch (ReviewManagementDAOException e) { + ConnectionManagerUtil.rollbackDBTransaction(); + String msg = "Error occurred when getting review data or adding review data for application release which " + + "has UUID: " + uuid; + log.error(msg); + throw new ReviewManagementException(msg, e); + } finally { + ConnectionManagerUtil.closeDBConnection(); + } + } + + @Override + public boolean addReplyComment(ReviewWrapper reviewWrapper, String uuid, int parentReviewId) + throws ReviewManagementException, ApplicationManagementException { + int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true); + String username = PrivilegedCarbonContext.getThreadLocalCarbonContext().getUsername(); + + if (reviewWrapper == null) { + String msg = "Request payload is null. Please verify the request payload."; + log.error(msg); + throw new BadRequestException(msg); + } + try { + ConnectionManagerUtil.beginDBTransaction(); + ApplicationReleaseDTO applicationReleaseDTO = this.applicationReleaseDAO.getReleaseByUUID(uuid, tenantId); + if (applicationReleaseDTO == null) { + String msg = "Couldn't find application release for the application UUID: " + uuid; + log.error(msg); + throw new NotFoundException(msg); } - return isSuccess; + ReviewDTO parentReview = this.reviewDAO.getReview(applicationReleaseDTO.getId(), parentReviewId); + if (parentReview == null) { + String msg = "Couldn't find an review which has review ID: " + parentReviewId + + " for application release which has UUID: " + uuid; + log.error(msg); + throw new BadRequestException(msg); + } + ReviewDTO replyComment = reviewWrapperToDO(reviewWrapper); + replyComment.setUsername(username); + replyComment.setImmediateParentId(parentReview.getId()); + if (parentReview.getRootParentId() == -1) { + replyComment.setRootParentId(parentReview.getId()); + } else { + replyComment.setRootParentId(parentReview.getRootParentId()); + } + if (this.reviewDAO.addReview(replyComment, applicationReleaseDTO.getId(), tenantId)) { + ConnectionManagerUtil.commitDBTransaction(); + return true; + } + return false; } catch (DBConnectionException e) { throw new ReviewManagementException( - "DB Connection error occurs ,Review for application release with UUID: " + uuid + " is failed", e); - } catch (UserStoreException e) { - throw new ReviewManagementException("Error occured while verifying user's permission to update the review.", + "DB Connection error occurs ,ReviewTmp for application release with UUID: " + uuid + " is failed", e); + } catch (TransactionManagementException e) { + String msg = "DB transaction error occurred when adding reply comment for comment which has comment id: " + + parentReviewId; + log.error(msg); + throw new ReviewManagementException(msg, e); } catch (ApplicationManagementDAOException e) { throw new ReviewManagementException( "Error occured while verifying whether application release is exists or not.", e); @@ -100,106 +199,182 @@ public class ReviewManagerImpl implements ReviewManager { } } + private ReviewDTO reviewWrapperToDO(ReviewWrapper reviewWrapper){ + ReviewDTO reviewDTO = new ReviewDTO(); + reviewDTO.setContent(reviewWrapper.getContent()); + reviewDTO.setRating(reviewWrapper.getRating()); + return reviewDTO; + } + + private List reviewDTOToReview(List reviewDTOs){ + List reviews = new ArrayList<>(); + + for (ReviewDTO reviewDTO : reviewDTOs){ + Review review = new Review(); + review.setId(reviewDTO.getId()); + review.setContent(reviewDTO.getContent()); + review.setRootParentId(reviewDTO.getRootParentId()); + review.setImmediateParentId(reviewDTO.getImmediateParentId()); + review.setCreatedAt(reviewDTO.getCreatedAt()); + review.setModifiedAt(reviewDTO.getModifiedAt()); + review.setReplies(new ArrayList<>()); + reviews.add(review); + } + return reviews; + } + + private Review reviewDTOToReview(ReviewDTO reviewDTO){ + Review review = new Review(); + review.setId(reviewDTO.getId()); + review.setContent(reviewDTO.getContent()); + review.setRootParentId(reviewDTO.getRootParentId()); + review.setImmediateParentId(reviewDTO.getImmediateParentId()); + review.setCreatedAt(reviewDTO.getCreatedAt()); + review.setModifiedAt(reviewDTO.getModifiedAt()); + review.setReplies(new ArrayList<>()); + return review; + } + @Override - public boolean updateReview(Review review, int reviewId, String uuid, Review existingReview) - throws ReviewManagementException { + public boolean updateReview(ReviewWrapper updatingReview, int reviewId, String uuid) + throws ReviewManagementException, ApplicationManagementException { int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true); String username = PrivilegedCarbonContext.getThreadLocalCarbonContext().getUsername(); - boolean isConnectionOpen = false; if (log.isDebugEnabled()) { - log.debug("Review updating request is received for the review id " + reviewId); + log.debug("ReviewTmp updating request is received for the reviewTmp id " + reviewId); } try { - if (existingReview == null) { - ConnectionManagerUtil.openDBConnection(); - isConnectionOpen = true; - existingReview = this.reviewDAO.getReview(reviewId); - if (existingReview != null && isAuthorizedUser(username, existingReview.getUsername(), tenantId)) { - if (review.getRating() > 0 && review.getRating() != existingReview.getRating()) { - Review finalExistingReview = existingReview; - Runnable task = () -> calculateRating(review.getRating(), finalExistingReview.getRating(), - uuid, tenantId); - new Thread(task).start(); - } - } else { - throw new ReviewManagementException( - "Please check the existence of the review, Review-Id: " + reviewId - + " or permission of the " + username + " to update the review."); - } + ConnectionManagerUtil.openDBConnection(); + ApplicationReleaseDTO applicationReleaseDTO = this.applicationReleaseDAO.getReleaseByUUID(uuid, tenantId); + if (applicationReleaseDTO == null) { + String msg = "Couldn't found an application release for UUID: " + uuid; + log.error(msg); + throw new NotFoundException(msg); } - if (review.getComment().isEmpty()) { - review.setComment(existingReview.getComment()); + ReviewDTO reviewDTO = this.reviewDAO.getReview(applicationReleaseDTO.getId(), reviewId); + if (reviewDTO == null) { + String msg = + "Couldn't found a review for application release which has UUID: " + uuid + " and review ID: " + + reviewId; + log.error(msg); + throw new NotFoundException(msg); } - if (review.getRating() == 0) { - review.setRating(existingReview.getRating()); + + if (!username.equals(reviewDTO.getUsername())) { + String msg = "You are trying to update a review which is triggered by " + reviewDTO.getUsername() + + ". Hence you are not permitted to update the review."; + log.error(msg); + throw new ForbiddenException(msg); } - return this.reviewDAO.updateReview(review, reviewId, username, tenantId) == 1; + + if (reviewDTO.getRootParentId() == -1 && reviewDTO.getImmediateParentId() == -1 + && updatingReview.getRating() > 0 && updatingReview.getRating() != reviewDTO.getRating()) { + Runnable task = () -> calculateRating(updatingReview.getRating(), reviewDTO.getRating(), uuid, + tenantId); + new Thread(task).start(); + reviewDTO.setRating(updatingReview.getRating()); + } + reviewDTO.setContent(updatingReview.getContent()); + return this.reviewDAO.updateReview(reviewDTO, reviewId, tenantId) == 1; } catch (ReviewManagementDAOException e) { - throw new ReviewManagementException("Error occured while getting review with review id " + reviewId + ".", - e); + String msg = "Error occured while getting reviewTmp with reviewTmp id " + reviewId + "."; + log.error(msg); + throw new ReviewManagementException(msg, e); } catch (DBConnectionException e) { - throw new ReviewManagementException( - "DB Connection error occurs updating review with review id " + reviewId + ".", e); - } catch (UserStoreException e) { - throw new ReviewManagementException( - "Error occured while verifying user's permission to update the review. review id: " + reviewId - + ".", e); + String msg = "DB Connection error occurs updating reviewTmp with reviewTmp id " + reviewId + "."; + log.error(msg); + throw new ReviewManagementException(msg, e); + } catch (ApplicationManagementDAOException e) { + String msg = "Error occured when getting application release data for application release UUID: " + uuid; + log.error(msg); + throw new ApplicationManagementException(msg, e); } finally { - if (isConnectionOpen) { - ConnectionManagerUtil.closeDBConnection(); - } + ConnectionManagerUtil.closeDBConnection(); } } @Override public PaginationResult getAllReviews(PaginationRequest request, String uuid) - throws ReviewManagementException { + throws ReviewManagementException, ApplicationManagementException { int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true); PaginationResult paginationResult = new PaginationResult(); - int numOfComments; - List reviews; - TreeMap hierarchicalReviewSet = new TreeMap<>(); + TreeMap> reviewTree = new TreeMap<>(); if (log.isDebugEnabled()) { - log.debug("Get all reviews of the application release uuid: " + uuid); + log.debug("Get all reviewTmps of the application release uuid: " + uuid); } try { ConnectionManagerUtil.openDBConnection(); - reviews = this.reviewDAO.getAllReviews(uuid, request, tenantId); - - for (Review review : reviews) { - if (hierarchicalReviewSet.containsKey(review.getParentId())) { - Review parentReview = hierarchicalReviewSet.get(review.getParentId()); - parentReview.setReplyReview(review); - hierarchicalReviewSet.replace(review.getParentId(), parentReview); - } else { - hierarchicalReviewSet.put(review.getId(), review); + ApplicationReleaseDTO releaseDTO = this.applicationReleaseDAO.getReleaseByUUID(uuid, tenantId); + if (releaseDTO == null){ + String msg = "Couldn't found an application release for UUID: " + uuid; + log.error(msg); + throw new NotFoundException(msg); + } + List reviewDTOs= this.reviewDAO.getAllReviews(releaseDTO.getId(), request, tenantId); + for (ReviewDTO reviewDTO : reviewDTOs){ + ReviewNode rootNode = new ReviewNode<>(reviewDTO); + reviewTree.put(reviewDTO.getId(), rootNode); + List replyComments = this.reviewDAO.getReplyComments(reviewDTO.getId(), tenantId); + replyComments.sort(Comparator.comparing(ReviewDTO::getId)); + for (ReviewDTO reply : replyComments){ + reviewTree.put(reply.getRootParentId(), + findAndSetChild(reviewTree.get(reply.getRootParentId()), reply)); } } - numOfComments = hierarchicalReviewSet.size(); - if (numOfComments > 0) { - paginationResult.setData(new ArrayList<>(hierarchicalReviewSet.values())); - paginationResult.setRecordsFiltered(numOfComments); - paginationResult.setRecordsTotal(numOfComments); - } else { - paginationResult.setData(new ArrayList()); - paginationResult.setRecordsFiltered(0); - paginationResult.setRecordsTotal(0); + int numOfReviews = reviewTree.size(); + List results = new ArrayList<>(); + + for (ReviewNode reviewNode : reviewTree.values()){ + results.add(constructReviewResponse(null, reviewNode)); } + paginationResult.setData(new ArrayList<>(results)); + paginationResult.setRecordsFiltered(numOfReviews); + paginationResult.setRecordsTotal(numOfReviews); return paginationResult; } catch (ReviewManagementDAOException e) { - throw new ReviewManagementException("Error occured while getting all reviews for application uuid: " + uuid, + throw new ReviewManagementException("Error occured while getting all reviewTmps for application uuid: " + uuid, e); } catch (DBConnectionException e) { throw new ReviewManagementException("Error occured while getting the DB connection.", e); + } catch (ApplicationManagementDAOException e) { + String msg = "Error occurred while getting application release details for application release UUId " + uuid; + log.error(msg); + throw new ApplicationManagementException(msg, e); } finally { ConnectionManagerUtil.closeDBConnection(); } } + private ReviewNode findAndSetChild(ReviewNode node, ReviewDTO reviewDTO) { + if (node.getData().getId() == reviewDTO.getImmediateParentId()){ + ReviewNode childNode = new ReviewNode<>(reviewDTO); + node.addChild(childNode); + return node; + } + for (ReviewNode each : node.getChildren()) { + findAndSetChild(each, reviewDTO); + } + return node; + } + + private Review constructReviewResponse(Review parentReview, ReviewNode node) { + Review review = reviewDTOToReview(node.getData()); + if (parentReview != null){ + parentReview.getReplies().add(review); + } + if (node.getChildren().isEmpty()){ + return review; + } + for (ReviewNode reviewDTOReviewNode : node.getChildren()) { + constructReviewResponse(review, reviewDTOReviewNode); + } + return review; + } + @Override public boolean deleteReview(String uuid, int reviewId) throws ReviewManagementException, ReviewDoesNotExistException { - Review existingReview; + ReviewDTO existingReview; int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true); String username = PrivilegedCarbonContext.getThreadLocalCarbonContext().getUsername(); try { diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/util/APIUtil.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/util/APIUtil.java index d4cc2f72c74..d3ae664f320 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/util/APIUtil.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/util/APIUtil.java @@ -120,7 +120,7 @@ public class APIUtil { } /** - * To get the Review Manager from the osgi context. + * To get the ReviewTmp Manager from the osgi context. * @return ReviewManager instance in the current osgi context. */ public static ReviewManager getReviewManager() { @@ -131,7 +131,7 @@ public class APIUtil { reviewManager = (ReviewManager) ctx.getOSGiService(ReviewManager.class, null); if (reviewManager == null) { - String msg = "Review Manager service has not initialized."; + String msg = "ReviewTmp Manager service has not initialized."; log.error(msg); throw new IllegalStateException(msg); } diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/util/ApplicationManagementUtil.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/util/ApplicationManagementUtil.java index 3d3da35b870..30751baa962 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/util/ApplicationManagementUtil.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/util/ApplicationManagementUtil.java @@ -32,7 +32,7 @@ import org.wso2.carbon.device.application.mgt.core.lifecycle.LifecycleStateManag import java.lang.reflect.Constructor; /** - * This Util class is responsible for making sure single instance of each Extension Manager is used throughout for + * This DAOUtil class is responsible for making sure single instance of each Extension Manager is used throughout for * all the tasks. */ public class ApplicationManagementUtil { diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/util/Constants.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/util/Constants.java index d883ad454b7..4c705094a51 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/util/Constants.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/util/Constants.java @@ -63,4 +63,6 @@ public class Constants { * Directory name of the release artifacts that are saved in the file system. */ public static final String RELEASE_ARTIFACT = "artifact"; + + public static final int REVIEW_PARENT_ID = -1; } diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/common/Util.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/util/DAOUtil.java similarity index 89% rename from components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/common/Util.java rename to components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/util/DAOUtil.java index 6a98cd17805..57db28ef403 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/common/Util.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/util/DAOUtil.java @@ -16,7 +16,7 @@ * under the License. * */ -package org.wso2.carbon.device.application.mgt.core.dao.common; +package org.wso2.carbon.device.application.mgt.core.util; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -27,6 +27,7 @@ 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.DeviceSubscriptionDTO; +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.ApplicationStorageManager; @@ -34,8 +35,6 @@ import org.wso2.carbon.device.application.mgt.common.services.SubscriptionManage 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.impl.ApplicationStorageManagerImpl; -import org.wso2.carbon.device.application.mgt.core.util.ApplicationManagementUtil; import org.wso2.carbon.device.mgt.core.service.DeviceManagementProviderService; import org.wso2.carbon.device.mgt.core.service.DeviceManagementProviderServiceImpl; @@ -48,9 +47,9 @@ import java.util.List; /** * This class is responsible for handling the utils of the Application Management DAO. */ -public class Util { +public class DAOUtil { - private static final Log log = LogFactory.getLog(Util.class); + private static final Log log = LogFactory.getLog(DAOUtil.class); /** * To create application object from the result set retrieved from the Database. @@ -146,6 +145,7 @@ public class Util { appRelease.setAppHashValue(rs.getString("RELEASE_HASH_VALUE")); appRelease.setPrice(rs.getDouble("RELEASE_PRICE")); appRelease.setMetaData(rs.getString("RELEASE_META_INFO")); + appRelease.setPackageName(rs.getString("PACKAGE_NAME")); appRelease.setSupportedOsVersions(rs.getString("RELEASE_SUP_OS_VERSIONS")); appRelease.setRating(rs.getDouble("RELEASE_RATING")); appRelease.setCurrentState(rs.getString("RELEASE_CURRENT_STATE")); @@ -204,6 +204,36 @@ public class Util { return applicationRelease; } + public static ReviewDTO loadReview(ResultSet rs) throws SQLException, UnexpectedServerErrorException { + List reviewDTOs = loadReviews(rs); + if (reviewDTOs.isEmpty()) { + return null; + } + if (reviewDTOs.size() > 1) { + String msg = "Internal server error. Found more than one review for requested review ID"; + log.error(msg); + throw new UnexpectedServerErrorException(msg); + } + return reviewDTOs.get(0); + } + + public static List loadReviews (ResultSet rs) throws SQLException { + List reviewDTOs = new ArrayList<>(); + while (rs.next()) { + ReviewDTO reviewDTO = new ReviewDTO(); + reviewDTO.setId(rs.getInt("ID")); + reviewDTO.setContent(rs.getString("COMMENT")); + reviewDTO.setCreatedAt(rs.getTimestamp("CREATED_AT")); + reviewDTO.setModifiedAt(rs.getTimestamp("MODIFIED_AT")); + reviewDTO.setRootParentId(rs.getInt("ROOT_PARENT_ID")); + reviewDTO.setImmediateParentId(rs.getInt("IMMEDIATE_PARENT_ID")); + reviewDTO.setUsername(rs.getString("USERNAME")); + reviewDTO.setRating(rs.getInt("RATING")); + reviewDTOs.add(reviewDTO); + } + return reviewDTOs; + } + /** * Cleans up the statement and resultset after executing the query * @@ -248,7 +278,7 @@ public class Util { public static ApplicationManager getApplicationManager() { if (applicationManager == null) { - synchronized (Util.class) { + synchronized (DAOUtil.class) { if (applicationManager == null) { PrivilegedCarbonContext ctx = PrivilegedCarbonContext.getThreadLocalCarbonContext(); applicationManager = @@ -272,7 +302,7 @@ public class Util { try { if (applicationStorageManager == null) { - synchronized (Util.class) { + synchronized (DAOUtil.class) { if (applicationStorageManager == null) { applicationStorageManager = ApplicationManagementUtil .getApplicationStorageManagerInstance(); @@ -299,7 +329,7 @@ public class Util { */ public static SubscriptionManager getSubscriptionManager() { if (subscriptionManager == null) { - synchronized (Util.class) { + synchronized (DAOUtil.class) { if (subscriptionManager == null) { PrivilegedCarbonContext ctx = PrivilegedCarbonContext.getThreadLocalCarbonContext(); subscriptionManager = diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.api/src/main/java/org/wso2/carbon/device/application/mgt/publisher/api/services/impl/ApplicationManagementPublisherAPIImpl.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.api/src/main/java/org/wso2/carbon/device/application/mgt/publisher/api/services/impl/ApplicationManagementPublisherAPIImpl.java index 57f91e07207..9d53177a031 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.api/src/main/java/org/wso2/carbon/device/application/mgt/publisher/api/services/impl/ApplicationManagementPublisherAPIImpl.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.api/src/main/java/org/wso2/carbon/device/application/mgt/publisher/api/services/impl/ApplicationManagementPublisherAPIImpl.java @@ -453,7 +453,9 @@ public class ApplicationManagementPublisherAPIImpl implements ApplicationManagem @Valid LifecycleChanger lifecycleChanger) { ApplicationManager applicationManager = APIUtil.getApplicationManager(); try { - applicationManager.changeLifecycleState(applicationUuid, lifecycleChanger); + ApplicationRelease applicationRelease = applicationManager + .changeLifecycleState(applicationUuid, lifecycleChanger); + return Response.status(Response.Status.CREATED).entity(applicationRelease).build(); } catch (BadRequestException e) { String msg = "Request payload contains invalid data, hence veryfy the request payload."; log.error(msg, e); @@ -472,7 +474,6 @@ public class ApplicationManagementPublisherAPIImpl implements ApplicationManagem log.error(msg, e); return Response.status(Response.Status.INTERNAL_SERVER_ERROR).build(); } - return Response.status(Response.Status.CREATED).entity("Lifecycle state added successfully.").build(); } @GET diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.store.api/pom.xml b/components/application-mgt/org.wso2.carbon.device.application.mgt.store.api/pom.xml index ae5daccb491..d0a291c5446 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.store.api/pom.xml +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.store.api/pom.xml @@ -157,16 +157,6 @@ org.wso2.carbon.devicemgt org.wso2.carbon.device.application.mgt.core provided - - - org.mockito - mockito-core - - - javassist - javassist - - org.wso2.carbon.devicemgt diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.store.api/src/main/java/org/wso2/carbon/device/application/mgt/store/api/services/ReviewManagementAPI.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.store.api/src/main/java/org/wso2/carbon/device/application/mgt/store/api/services/ReviewManagementAPI.java index 045e5163b0d..f9a4c8f39dc 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.store.api/src/main/java/org/wso2/carbon/device/application/mgt/store/api/services/ReviewManagementAPI.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.store.api/src/main/java/org/wso2/carbon/device/application/mgt/store/api/services/ReviewManagementAPI.java @@ -32,7 +32,9 @@ import org.wso2.carbon.apimgt.annotations.api.Scope; import org.wso2.carbon.apimgt.annotations.api.Scopes; import org.wso2.carbon.device.application.mgt.common.PaginationResult; import org.wso2.carbon.device.application.mgt.common.ErrorResponse; -import org.wso2.carbon.device.application.mgt.common.Review; +import org.wso2.carbon.device.application.mgt.common.ReviewTmp; +import org.wso2.carbon.device.application.mgt.common.wrapper.ReviewWrapper; + import javax.validation.Valid; import javax.ws.rs.Path; import javax.ws.rs.Consumes; @@ -63,29 +65,28 @@ import java.util.List; } ), tags = { - @Tag(name = "review_management", description = "Review Management related APIs") + @Tag(name = "review_management", description = "ReviewTmp Management related APIs") } ) @Scopes( scopes = { @Scope( name = "Get Review Details", - description = "Get review details", + description = "Get review details from application store.", key = "perm:app:review:view", permissions = {"/app-mgt/store/review/view"} ), @Scope( name = "Update a Review", - description = "Update a comment", + description = "Update a Review from the application store.", key = "perm:app:review:update", permissions = {"/app-mgt/store/review/update"} ), } ) -@Path("/review") -@Api(value = "Review Management", description = "This API carries all review management related operations such as get " - + "all the reviews, add review, etc.") +@Path("/reviews") +@Api(value = "ReviewTmp Management") @Produces(MediaType.APPLICATION_JSON) public interface ReviewManagementAPI { String SCOPE = "scope"; @@ -113,6 +114,9 @@ public interface ReviewManagementAPI { message = "OK. \n Successfully retrieved reviews.", response = PaginationResult.class, responseContainer = "PaginationResult"), + @ApiResponse( + code = 404, + message = "Not Found. \n Not found an application release for requested UUID."), @ApiResponse( code = 500, message = "Internal Server Error. \n Error occurred while getting the review list.", @@ -145,7 +149,7 @@ public interface ReviewManagementAPI { produces = MediaType.APPLICATION_JSON, httpMethod = "POST", value = "Add a review", - notes = "This will add a new review", + notes = "This will add a new review for application release.", tags = "Store Management", extensions = { @Extension(properties = { @@ -158,29 +162,89 @@ public interface ReviewManagementAPI { value = { @ApiResponse( code = 201, - message = "OK. \n Successfully add a review.", - response = Review.class), + message = "OK. \n Successfully add a reviewTmp.", + response = ReviewTmp.class), @ApiResponse( code = 400, message = - "Bad Request. \n"), + "Bad Request. \n Found invalid payload with the request."), + @ApiResponse( + code = 403, + message = "Don't have permission to add a review."), + @ApiResponse( + code = 404, + message = "Not Found. \n Not found an application release for requested UUID."), @ApiResponse( code = 500, - message = "Internal Server Error. \n Error occurred adding a review.", + message = "Internal Server Error. \n Error occurred adding a reviewTmp.", response = ErrorResponse.class) }) Response addReview( @ApiParam( - name = "review", - value = "Review details", - required = true) Review review, + name = "reviewTmp", + value = "ReviewTmp details", + required = true) ReviewWrapper reviewWrapper, @ApiParam( name="uuid", - value="uuid of the release version of the application", + value="uuid of the application release.", required=true) @PathParam("uuid") String uuid); + @POST + @Path("/{uuid}/{parentReviewId}") + @Produces(MediaType.APPLICATION_JSON) + @Consumes(MediaType.APPLICATION_JSON) + @ApiOperation( + consumes = MediaType.APPLICATION_JSON, + produces = MediaType.APPLICATION_JSON, + httpMethod = "POST", + value = "Add a reply comment", + notes = "This will add a reply comment for a comment or review.", + tags = "Store Management", + extensions = { + @Extension(properties = { + @ExtensionProperty(name = SCOPE, value = "perm:app:reviewTmp:update") + }) + } + ) + + @ApiResponses( + value = { + @ApiResponse( + code = 201, + message = "OK. \n Successfully add a reviewTmp.", + response = ReviewTmp.class), + @ApiResponse( + code = 400, + message = + "Bad Request. \n Found invalid payload with the request."), + @ApiResponse( + code = 404, + message = "Not Found. \n Not found an application release for requested UUID."), + + @ApiResponse( + code = 500, + message = "Internal Server Error. \n Error occurred adding a reviewTmp.", + response = ErrorResponse.class) + }) + + Response addReplyComment( + @ApiParam( + name = "review", + value = "Reply comment details", + required = true) ReviewWrapper reviewWrapper, + @ApiParam( + name="uuid", + value="uuid of the application release.", + required=true) + @PathParam("uuid") String uuid, + @ApiParam( + name="parentReviewId", + value="uuid of the application release.", + required=true) + @PathParam("parentReviewId") int parentReviewId); + @PUT @Path("/{uuid}/{reviewId}") @Produces(MediaType.APPLICATION_JSON) @@ -189,8 +253,8 @@ public interface ReviewManagementAPI { consumes = MediaType.APPLICATION_JSON, produces = MediaType.APPLICATION_JSON, httpMethod = "PUT", - value = "Edit a review", - notes = "This will edit the review", + value = "Edit a reviewTmp", + notes = "This will edit the reviewTmp", tags = "Store Management", extensions = { @Extension(properties = { @@ -202,22 +266,22 @@ public interface ReviewManagementAPI { value = { @ApiResponse( code = 200, - message = "OK. \n Successfully updated review.", - response = Review.class), + message = "OK. \n Successfully updated reviewTmp.", + response = ReviewTmp.class), @ApiResponse( code = 400, message = "Bad Request. \n Invalid request or validation error."), @ApiResponse( code = 500, - message = "Internal Server Error. \n Error occurred while updating the new review.", + message = "Internal Server Error. \n Error occurred while updating the new reviewTmp.", response = ErrorResponse.class) }) Response updateReview( @ApiParam( - name = "review", - value = "The review that need to be updated.", + name = "reviewTmp", + value = "The reviewTmp that need to be updated.", required = true) - @Valid Review review, + @Valid ReviewWrapper updatingReview, @ApiParam( name="uuid", value = "uuid of the application release", @@ -225,7 +289,7 @@ public interface ReviewManagementAPI { @PathParam("uuid") String uuid, @ApiParam( name="reviewId", - value = "review id of the updating review.", + value = "reviewTmp id of the updating reviewTmp.", required = true) @PathParam("reviewId") int reviewId); diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.store.api/src/main/java/org/wso2/carbon/device/application/mgt/store/api/services/impl/ReviewManagementAPIImpl.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.store.api/src/main/java/org/wso2/carbon/device/application/mgt/store/api/services/impl/ReviewManagementAPIImpl.java index da6a6a72283..860efe8e38d 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.store.api/src/main/java/org/wso2/carbon/device/application/mgt/store/api/services/impl/ReviewManagementAPIImpl.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.store.api/src/main/java/org/wso2/carbon/device/application/mgt/store/api/services/impl/ReviewManagementAPIImpl.java @@ -23,10 +23,11 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.wso2.carbon.device.application.mgt.common.PaginationResult; import org.wso2.carbon.device.application.mgt.common.Rating; -import org.wso2.carbon.device.application.mgt.common.Review; -import org.wso2.carbon.device.application.mgt.common.exception.RequestValidatingException; import org.wso2.carbon.device.application.mgt.common.exception.ReviewDoesNotExistException; import org.wso2.carbon.device.application.mgt.common.services.ReviewManager; +import org.wso2.carbon.device.application.mgt.common.wrapper.ReviewWrapper; +import org.wso2.carbon.device.application.mgt.core.exception.BadRequestException; +import org.wso2.carbon.device.application.mgt.core.exception.ForbiddenException; import org.wso2.carbon.device.application.mgt.core.exception.NotFoundException; import org.wso2.carbon.device.application.mgt.store.api.services.ReviewManagementAPI; import org.wso2.carbon.device.application.mgt.common.PaginationRequest; @@ -46,9 +47,9 @@ import javax.ws.rs.DELETE; import javax.ws.rs.core.Response; /** - * Review Management related jax-rs APIs. + * ReviewTmp Management related jax-rs APIs. */ -@Path("/review") +@Path("/reviews") public class ReviewManagementAPIImpl implements ReviewManagementAPI { private static Log log = LogFactory.getLog(ReviewManagementAPIImpl.class); @@ -65,10 +66,18 @@ public class ReviewManagementAPIImpl implements ReviewManagementAPI { try { PaginationResult paginationResult = reviewManager.getAllReviews(request, uuid); return Response.status(Response.Status.OK).entity(paginationResult).build(); + } catch (NotFoundException e) { + String msg = "Couldn't find an application release for UUID: " + uuid; + log.error(msg, e); + return Response.status(Response.Status.NOT_FOUND).entity(msg).build(); } catch (ReviewManagementException e) { String msg = "Error occurred while retrieving reviews for application UUID: " + uuid; log.error(msg, e); return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(msg).build(); + } catch (ApplicationManagementException e) { + String msg = "Error occurred while retrieving application release details for application UUID: " + uuid; + log.error(msg, e); + return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(msg).build(); } } @@ -77,31 +86,73 @@ public class ReviewManagementAPIImpl implements ReviewManagementAPI { @Consumes("application/json") @Path("/{uuid}") public Response addReview( - @ApiParam Review review, + @ApiParam ReviewWrapper reviewWrapper, @PathParam("uuid") String uuid) { ReviewManager reviewManager = APIUtil.getReviewManager(); try { - boolean isReviewCreated = reviewManager.addReview(review, uuid); + boolean isReviewCreated = reviewManager.addReview(reviewWrapper, uuid); if (isReviewCreated) { - return Response.status(Response.Status.CREATED).entity(review).build(); + return Response.status(Response.Status.CREATED).entity(reviewWrapper).build(); } else { - String msg = "Given review is not valid. Please check the review payload."; + String msg = "Review adding is failed. Please contact the administrator."; log.error(msg); - return Response.status(Response.Status.BAD_REQUEST).entity(msg).build(); + return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(msg).build(); } } catch (NotFoundException e) { String msg = "Couldn't find an application release for UUID: " + uuid; log.error(msg, e); return Response.status(Response.Status.NOT_FOUND).entity(msg).build(); + } catch (BadRequestException e) { + String msg = "Found invalid payload data with the request. Hence, please verify the request payload."; + log.error(msg); + return Response.status(Response.Status.BAD_REQUEST).entity(msg).build(); + } catch (ForbiddenException e) { + String msg = "You have already reviewed the application. Hence you are not permitted to review the " + + "application again."; + log.error(msg, e); + return Response.status(Response.Status.FORBIDDEN).entity(msg).build(); } catch (ReviewManagementException e) { - String msg = "Error occurred while creating the review"; + String msg = "Error occurred while creating the reviewTmp"; log.error(msg, e); return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(msg).build(); - } catch (RequestValidatingException e) { - String msg = - "Error occurred while adding for application release. UUID of the application release: " + uuid; + } catch (ApplicationManagementException e) { + String msg = "Error occured while accessing application release for UUID: " + uuid; log.error(msg, e); + return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(msg).build(); + } + } + + @Override + @POST + @Consumes("application/json") + @Path("/{uuid}/{parentReviewId}") + public Response addReplyComment( + @ApiParam ReviewWrapper reviewWrapper, + @PathParam("uuid") String uuid, + @PathParam("parentReviewId") int parentReviewId) { + ReviewManager reviewManager = APIUtil.getReviewManager(); + try { + boolean isRepliedForReview = reviewManager.addReplyComment(reviewWrapper, uuid, parentReviewId); + if (isRepliedForReview) { + return Response.status(Response.Status.CREATED).entity(reviewWrapper).build(); + } else { + String msg = "Error occured when adding reply comment for the review. Please contact the administrator.."; + log.error(msg); + return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(msg).build(); + } + } catch (NotFoundException e) { + String msg = "Couldn't find an application release for UUID: " + uuid; + log.error(msg, e); + return Response.status(Response.Status.NOT_FOUND).entity(msg).build(); + } catch (BadRequestException e) { + String msg = "Found invalid payload data with the request to add reply comment. Hence, please verify the " + + "request payload."; + log.error(msg); return Response.status(Response.Status.BAD_REQUEST).entity(msg).build(); + }catch (ReviewManagementException e) { + String msg = "Error occurred while creating the reviewTmp"; + log.error(msg, e); + return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(msg).build(); } catch (ApplicationManagementException e) { String msg = "Error occured while accessing application release for UUID: " + uuid; log.error(msg, e); @@ -114,13 +165,13 @@ public class ReviewManagementAPIImpl implements ReviewManagementAPI { @Consumes("application/json") @Path("/{uuid}/{reviewId}") public Response updateReview( - @ApiParam Review review, + @ApiParam ReviewWrapper updatingReview, @PathParam("uuid") String uuid, @PathParam("reviewId") int reviewId) { ReviewManager reviewManager = APIUtil.getReviewManager(); try { - if (reviewManager.updateReview(review, reviewId, uuid, null)) { - return Response.status(Response.Status.OK).entity(review).build(); + if (reviewManager.updateReview(updatingReview, reviewId, uuid)) { + return Response.status(Response.Status.OK).entity(updatingReview).build(); } else { String msg = "Review updating failed. Please contact the administrator"; log.error(msg); @@ -130,11 +181,18 @@ public class ReviewManagementAPIImpl implements ReviewManagementAPI { String msg = "Error occurred while retrieving comments."; log.error(msg, e); return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(msg).build(); - } catch (RequestValidatingException e) { - String msg = "Error occurred while updating review. Review id: " + reviewId; + } catch (NotFoundException e) { + String msg = "Couldn't found application release data for UUID " + uuid + " or Review for review ID: " + reviewId; log.error(msg, e); - return Response.status(Response.Status.BAD_REQUEST).entity(msg).build(); - } + return Response.status(Response.Status.NOT_FOUND).entity(msg).build(); + } catch (ForbiddenException e) { + String msg = "You dont have permission to update application release review."; + log.error(msg, e); + return Response.status(Response.Status.FORBIDDEN).entity(msg).build(); + } catch (ApplicationManagementException e) { + String msg = "Error occurred when getting application release data for application release UUID:." + uuid; + log.error(msg, e); + return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(msg).build(); } } @Override @@ -147,9 +205,9 @@ public class ReviewManagementAPIImpl implements ReviewManagementAPI { ReviewManager reviewManager = APIUtil.getReviewManager(); try { if (reviewManager.deleteReview(uuid, reviewId)) { - return Response.status(Response.Status.OK).entity("Review is deleted successfully.").build(); + return Response.status(Response.Status.OK).entity("ReviewTmp is deleted successfully.").build(); } else { - return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity("Review deleting is failed.") + return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity("ReviewTmp deleting is failed.") .build(); } } catch (ReviewManagementException e) { @@ -173,7 +231,7 @@ public class ReviewManagementAPIImpl implements ReviewManagementAPI { try { rating = reviewManager.getRating(uuid); } catch (ReviewManagementException e) { - log.error("Review Management Exception occurs", e); + log.error("ReviewTmp Management Exception occurs", e); return Response.status(Response.Status.INTERNAL_SERVER_ERROR).build(); } return Response.status(Response.Status.OK).entity(rating).build(); diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.store.api/src/test/java/org/wso2/carbon/device/application/mgt/store/api/services/util/CommentMgtTestHelper.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.store.api/src/test/java/org/wso2/carbon/device/application/mgt/store/api/services/util/CommentMgtTestHelper.java index 5cd0418f1eb..c6b6b5f2a6b 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.store.api/src/test/java/org/wso2/carbon/device/application/mgt/store/api/services/util/CommentMgtTestHelper.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.store.api/src/test/java/org/wso2/carbon/device/application/mgt/store/api/services/util/CommentMgtTestHelper.java @@ -17,34 +17,34 @@ */ package org.wso2.carbon.device.application.mgt.store.api.services.util; -import org.wso2.carbon.device.application.mgt.common.Review; +import org.wso2.carbon.device.application.mgt.common.ReviewTmp; /** - * Helper class for Review Management API test cases. + * Helper class for ReviewTmp Management API test cases. */ public class CommentMgtTestHelper { - private static final String COMMENT_TEXT = "Dummy Review"; + private static final String COMMENT_TEXT = "Dummy ReviewTmp"; private static final String CREATED_BY = "TEST_CREATED_BY"; private static final String MODIFIED_BY = "TEST_MODIFIED_BY"; private static final int PARENT_ID = 123; private static final int COMMENT_ID = 1; /** - * Creates a Review with given text and given uuid. - * If the text is null, the COMMENT_TEXT will be used as the Dummy Review. + * Creates a ReviewTmp with given text and given uuid. + * If the text is null, the COMMENT_TEXT will be used as the Dummy ReviewTmp. * - * @param commentText : Text of the Review - * @return Review + * @param commentText : Text of the ReviewTmp + * @return ReviewTmp */ - public static Review getDummyComment(String commentText, String uuid) { - Review review = new Review(); - review.setId(COMMENT_ID); - review.setUsername(CREATED_BY); - review.setComment(commentText != null ? commentText : COMMENT_TEXT); + public static ReviewTmp getDummyComment(String commentText, String uuid) { + ReviewTmp reviewTmp = new ReviewTmp(); + reviewTmp.setId(COMMENT_ID); + reviewTmp.setUsername(CREATED_BY); + reviewTmp.setComment(commentText != null ? commentText : COMMENT_TEXT); - return review; + return reviewTmp; } } diff --git a/features/application-mgt/org.wso2.carbon.device.application.mgt.server.feature/src/main/resources/dbscripts/cdm/application-mgt/h2.sql b/features/application-mgt/org.wso2.carbon.device.application.mgt.server.feature/src/main/resources/dbscripts/cdm/application-mgt/h2.sql index 5450d3941dc..b060ec76526 100644 --- a/features/application-mgt/org.wso2.carbon.device.application.mgt.server.feature/src/main/resources/dbscripts/cdm/application-mgt/h2.sql +++ b/features/application-mgt/org.wso2.carbon.device.application.mgt.server.feature/src/main/resources/dbscripts/cdm/application-mgt/h2.sql @@ -55,7 +55,8 @@ CREATE TABLE IF NOT EXISTS AP_APP_REVIEW( ID INTEGER NOT NULL AUTO_INCREMENT, TENANT_ID INTEGER NOT NULL, COMMENT VARCHAR(250) NOT NULL, - REPLY_COMMENT VARCHAR(250) NULL, + ROOT_PARENT_ID INTEGER NOT NULL, + IMMEDIATE_PARENT_ID INTEGER NOT NULL, CREATED_AT TIMESTAMP NOT NULL, MODIFIED_AT TIMESTAMP NOT NULL, RATING INTEGER NULL,