blob: 39f5de78c7e9b1f6725bd6429c67693fd3f7b6d4 [file] [log] [blame]
/**
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF 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.apache.airavata.allocation.manager.server;
import static java.lang.System.in;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import org.apache.airavata.common.exception.ApplicationSettingsException;
import org.apache.airavata.allocation.manager.client.NotificationManager;
import org.apache.airavata.allocation.manager.db.repositories.*;
import org.apache.airavata.allocation.manager.db.utils.DBConstants;
import org.apache.airavata.allocation.manager.db.utils.JPAUtils;
import org.apache.airavata.allocation.manager.models.*;
import org.apache.airavata.allocation.manager.service.cpi.AllocationRegistryService;
import org.apache.commons.lang.exception.ExceptionUtils;
import org.apache.thrift.TException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class AllocationManagerServerHandler implements AllocationRegistryService.Iface {
private final static Logger logger = LoggerFactory.getLogger(AllocationManagerServerHandler.class);
public static String OWNER_PERMISSION_NAME = "OWNER";
public AllocationManagerServerHandler() throws AllocationManagerException, ApplicationSettingsException, TException, Exception {
JPAUtils.initializeDB();
}
@Override
public boolean createUser(UserDetail userDetail) throws TException {
// TODO Auto-generated method stub
try {
UserDetail create = (new UserDetailRepository()).create(userDetail);
return true;
} catch (Exception ex) {
logger.error(ex.getMessage(), ex);
throw new AllocationManagerException().setMessage(ex.getMessage() + " Stack trace:" + ExceptionUtils.getStackTrace(ex));
}
}
//Implementing createAllocationRequest method
@Override
public String createAllocationRequest(UserAllocationDetail reqDetails) throws AllocationManagerException, TException {
try {
if ((new UserAllocationDetailRepository()).isExists(reqDetails.getProjectId())) {
throw new TException("There exist project with the id");
}
reqDetails.setStatus(DBConstants.RequestStatus.PENDING);
UserAllocationDetail create = (new UserAllocationDetailRepository()).create(reqDetails);
return reqDetails.getProjectId();
} catch (Exception ex) {
logger.error(ex.getMessage(), ex);
throw new AllocationManagerException().setMessage(ex.getMessage() + " Stack trace:" + ExceptionUtils.getStackTrace(ex));
}
}
@Override
public boolean deleteAllocationRequest(String projectId) throws TException {
try {
(new UserAllocationDetailRepository()).delete(projectId);
return true;
} catch (Exception ex) {
logger.error(ex.getMessage(), ex);
throw new AllocationManagerException().setMessage(ex.getMessage() + " Stack trace:" + ExceptionUtils.getStackTrace(ex));
}
}
@Override
public boolean updateAllocationRequest(UserAllocationDetail reqDetails) throws TException {
try {
if ((new UserAllocationDetailRepository()).update(reqDetails).getProjectId() != null) {
return true;
}
} catch (Exception ex) {
logger.error(ex.getMessage(), ex);
throw new AllocationManagerException().setMessage(ex.getMessage() + " Stack trace:" + ExceptionUtils.getStackTrace(ex));
}
return false;
}
@Override
public UserAllocationDetail getAllocationRequest(String projectId) throws TException {
try {
return (new UserAllocationDetailRepository().get(projectId));
} catch (Exception ex) {
logger.error(ex.getMessage(), ex);
throw new AllocationManagerException().setMessage(ex.getMessage() + " Stack trace:" + ExceptionUtils.getStackTrace(ex));
}
}
@Override
public boolean isAdmin(String userName) throws AllocationManagerException, TException {
try {
UserDetail objUser = getUserDetails(userName);
if (objUser == null) {
throw new IllegalArgumentException();
}
return objUser.userType.equals(DBConstants.UserType.ADMIN);
} catch (Exception ex) {
throw new AllocationManagerException().setMessage(ex.getMessage() + " Stack trace:" + ExceptionUtils.getStackTrace(ex));
}
}
@Override
public boolean isReviewer(String userName) throws AllocationManagerException, TException {
try {
UserDetail objUser = getUserDetails(userName);
if (objUser == null) {
throw new IllegalArgumentException();
}
return objUser.userType.equals(DBConstants.UserType.REVIEWER);
} catch (Exception ex) {
throw new AllocationManagerException().setMessage(ex.getMessage() + " Stack trace:" + ExceptionUtils.getStackTrace(ex));
}
}
@Override
public List<UserAllocationDetail> getAllRequestsForReviewers(String userName) throws AllocationManagerException, TException {
List<UserAllocationDetail> userAllocationDetailList = new ArrayList<UserAllocationDetail>();
try {
if (!isReviewer(userName)) {
throw new AllocationManagerException().setMessage("Invalid reviewer id!");
}
List<ProjectReviewer> projReviewerList = (new ProjectReviewerRepository()).getProjectForReviewer(userName);
List<String> projectIds = new ArrayList<String>();
for (ProjectReviewer objProj : projReviewerList) {
projectIds.add(objProj.getProjectId());
}
return new UserAllocationDetailRepository().get(projectIds);
} catch (Exception ex) {
throw new AllocationManagerException().setMessage(ex.getMessage() + " Stack trace:" + ExceptionUtils.getStackTrace(ex));
}
}
@Override
public UserDetail getUserDetails(String userName) throws AllocationManagerException, TException {
try {
return (new UserDetailRepository()).get(userName);
} catch (Exception ex) {
logger.error(ex.getMessage(), ex);
throw new AllocationManagerException().setMessage(ex.getMessage() + " Stack trace:" + ExceptionUtils.getStackTrace(ex));
}
}
@Override
public List<UserAllocationDetail> getAllRequestsForAdmin(String userName) throws TException {
List<UserAllocationDetail> userAllocationDetailList = new ArrayList<UserAllocationDetail>();
try {
if (!isAdmin(userName)) {
throw new AllocationManagerException().setMessage("Invalid admin id!");
}
userAllocationDetailList = new UserAllocationDetailRepository().getAllUserRequests();
} catch (Exception ex) {
throw new AllocationManagerException().setMessage(ex.getMessage() + " Stack trace:" + ExceptionUtils.getStackTrace(ex));
}
return userAllocationDetailList;
}
@Override
public boolean assignReviewers(String projectId, String reviewerId, String adminId) throws TException {
try {
if (!isAdmin(adminId)) {
throw new AllocationManagerException().setMessage("Invalid admin id!");
}
if (!isReviewer(reviewerId)) {
throw new AllocationManagerException().setMessage("Invalid reviewer id!");
}
ProjectReviewer projectReviewer = new ProjectReviewer();
projectReviewer.setProjectId(projectId);
projectReviewer.setReviewer(reviewerId);
ProjectReviewer projectReviewerObj = new ProjectReviewerRepository().create(projectReviewer);
if (projectReviewerObj.getProjectId() != null) {
//Update the status to under review.
//Construct the primary key
UserAllocationDetail userAllocationDetail = new UserAllocationDetailRepository().get(projectId).setStatus(DBConstants.RequestStatus.UNDER_REVIEW);
//Updates the request
new UserAllocationDetailRepository().update(userAllocationDetail);
}
} catch (Exception ex) {
throw new AllocationManagerException().setMessage(ex.getMessage() + " Stack trace:" + ExceptionUtils.getStackTrace(ex));
}
return true;
}
@Override
public List<ReviewerAllocationDetail> getAllReviewsForARequest(String projectId) throws TException {
List<ReviewerAllocationDetail> reviewerAllocationDetailList = new ArrayList<ReviewerAllocationDetail>();
try {
reviewerAllocationDetailList = new ReviewerAllocationDetailRepository().getAllReviewsForARequest(projectId);
} catch (Exception ex) {
throw new AllocationManagerException().setMessage(ex.getMessage() + " Stack trace:" + ExceptionUtils.getStackTrace(ex));
}
return reviewerAllocationDetailList;
}
@Override
public List<UserDetail> getAllReviewers() throws TException {
try {
return new UserDetailRepository().getAllReviewers();
} catch (Exception ex) {
java.util.logging.Logger.getLogger(AllocationManagerServerHandler.class.getName()).log(Level.SEVERE, null, ex);
}
return null;
}
@Override
public boolean updateRequestByReviewer(ReviewerAllocationDetail reviewerAllocationDetail) throws TException {
try {
ReviewerAllocationDetail reviewerAllocationDetailObj = new ReviewerAllocationDetail();
reviewerAllocationDetailObj = new ReviewerAllocationDetailRepository().isProjectExists(reviewerAllocationDetail.getProjectId(),reviewerAllocationDetail.getUsername());
if (reviewerAllocationDetailObj!=null) {
reviewerAllocationDetail.setId(reviewerAllocationDetailObj.getId());
reviewerAllocationDetailObj = (new ReviewerAllocationDetailRepository()).update(reviewerAllocationDetail);
} else {
reviewerAllocationDetailObj = (new ReviewerAllocationDetailRepository()).create(reviewerAllocationDetail);
}
if (reviewerAllocationDetailObj.getProjectId() != null) {
return true;
}
} catch (Exception ex) {
logger.error(ex.getMessage(), ex);
throw new AllocationManagerException().setMessage(ex.getMessage() + " Stack trace:" + ExceptionUtils.getStackTrace(ex));
}
return false;
}
/*Method to get a list of all reviewers not yet assigned to a request*/
@Override
public List<UserDetail> getAllUnassignedReviewersForRequest(String projectId) throws TException {
List<UserDetail> userDetailList = getAllReviewers();
// TO_DO part
List<UserDetail> reviewerList = new ArrayList<UserDetail>();
for (UserDetail userDetailObj : userDetailList) {
try {
if (!new ProjectReviewerRepository().isProjectExists(projectId,userDetailObj.getUsername())) {
reviewerList.add(userDetailObj);
}
} catch (Exception ex) {
java.util.logging.Logger.getLogger(AllocationManagerServerHandler.class.getName()).log(Level.SEVERE, null, ex);
}
}
return reviewerList;
}
/*Method to update the request's start date, end date, status and award allocation on approval*/
@Override
public boolean approveRequest(String projectId, String adminId, long startDate, long endDate, long awardAllocation) throws TException {
try {
if (!isAdmin(adminId)) {
throw new AllocationManagerException().setMessage("Invalid admin id!");
}
//Create UserAllocationDetail object to call update method
UserAllocationDetail userAllocDetail = new UserAllocationDetail();
userAllocDetail = new UserAllocationDetailRepository().get(projectId);
userAllocDetail.setStatus(DBConstants.RequestStatus.APPROVED);
userAllocDetail.setStartDate(startDate);
userAllocDetail.setEndDate(endDate);
userAllocDetail.setAwardAllocation(awardAllocation);
//updates the request
return updateAllocationRequest(userAllocDetail);
} catch (Exception ex) {
throw new AllocationManagerException().setMessage(ex.getMessage() + " Stack trace:" + ExceptionUtils.getStackTrace(ex));
}
}
/*Method to update the request status to rejected on reject of a request*/
@Override
public boolean rejectRequest(String projectId, String adminId) throws TException {
try {
if (!isAdmin(adminId)) {
throw new AllocationManagerException().setMessage("Invalid admin id!");
}
//Create UserAllocationDetail object to call update method
UserAllocationDetail userAllocDetail = new UserAllocationDetail();
userAllocDetail = new UserAllocationDetailRepository().get(projectId);
userAllocDetail.setStatus(DBConstants.RequestStatus.REJECTED);
//Updates the request
return updateAllocationRequest(userAllocDetail);
} catch (Exception ex) {
throw new AllocationManagerException().setMessage(ex.getMessage() + " Stack trace:" + ExceptionUtils.getStackTrace(ex));
}
}
@Override
public String getAllocationRequestStatus(String projectId) throws TException {
try {
return (new UserAllocationDetailRepository().get(projectId).getStatus());
} catch (Exception ex) {
logger.error(ex.getMessage(), ex);
throw new AllocationManagerException().setMessage(ex.getMessage() + " Stack trace:" + ExceptionUtils.getStackTrace(ex));
}
}
@Override
public String getAllocationRequestUserEmail(String projectId) throws TException {
try {
return (new UserDetailRepository()).get(projectId).getEmail();
} catch (Exception ex) {
logger.error(ex.getMessage(), ex);
throw new AllocationManagerException().setMessage(ex.getMessage() + " Stack trace:" + ExceptionUtils.getStackTrace(ex));
}
}
@Override
public String getAllocationRequestUserName(String projectId) throws org.apache.thrift.TException {
try {
return (new UserDetailRepository()).get(projectId).getUsername();
} catch (Exception ex) {
logger.error(ex.getMessage(), ex);
throw new AllocationManagerException().setMessage(ex.getMessage() + " Stack trace:" + ExceptionUtils.getStackTrace(ex));
}
}
@Override
public String getAllocationManagerAdminEmail(String userType) throws TException {
try {
return (new UserDetailRepository()).getAdminDetails().getEmail();
} catch (Exception ex) {
logger.error(ex.getMessage(), ex);
throw new AllocationManagerException().setMessage(ex.getMessage() + " Stack trace:" + ExceptionUtils.getStackTrace(ex));
}
}
}