package edu.internet2.middleware.grouper;
import edu.internet2.middleware.subject.SubjectNotFoundException;
import net.sf.hibernate.HibernateException;
import org.apache.commons.lang.time.StopWatch;
import org.cagrid.gridgrouper.model.MembershipRequestStatus;
import java.util.ArrayList;
import java.util.LinkedHashSet;
import java.util.Set;
public class MembershipRequest {
private String id;
private Group group;
private String requestorId;
private long requestTime;
private MembershipRequestStatus status;
private Member reviewer;
private long reviewTime;
private String publicNote;
private String adminNote;
private ArrayList<MembershipRequestHistory> history = null;
public MembershipRequest() {
super();
}
public MembershipRequest(Group group, String requestor) {
this(group, requestor, MembershipRequestStatus.Pending);
}
private MembershipRequest(Group group, String requestorId, MembershipRequestStatus status) {
super();
this.group = group;
this.requestorId = requestorId;
this.requestTime = System.currentTimeMillis();
this.status = status;
}
public Group getGroup() {
return group;
}
public void setGroup(Group group) {
this.group = group;
}
public String getRequestorId() {
return requestorId;
}
public void setRequestorId(String requestorId) {
this.requestorId = requestorId;
}
public Member getReviewer() {
return reviewer;
}
public void setReviewer(Member reviewer) {
this.reviewer = reviewer;
}
public MembershipRequestStatus getStatus() {
return status;
}
private void setStatus(MembershipRequestStatus status) throws InsufficientPrivilegeException {
StopWatch sw = new StopWatch();
sw.start();
try {
this.status = status;
GridGrouperHibernateHelper.save(this);
MembershipRequestHistory membershipRequestHistory = new MembershipRequestHistory(this);
GridGrouperHibernateHelper.save(membershipRequestHistory);
sw.stop();
} catch (HibernateException eH) {
throw new InsufficientPrivilegeException(eH.getMessage(), eH);
}
}
private String getStatusValue() {
return status.toString();
}
private void setStatusValue(String value) {
this.status = MembershipRequestStatus.fromValue(value);
}
public String getId() {
return this.id;
}
private void setId(String id) {
this.id = id;
}
public long getRequestTime() {
return this.requestTime;
}
private void setRequestTime(long time) {
this.requestTime = time;
}
public long getReviewTime() {
return this.reviewTime;
}
private void setReviewTime(long time) {
this.reviewTime = time;
}
public String getPublicNote() {
return this.publicNote;
}
private void setPublicNote(String note) {
this.publicNote = note;
}
public String getAdminNote() {
return this.adminNote;
}
private void setAdminNote(String note) {
this.adminNote = note;
}
public ArrayList<MembershipRequestHistory> getHistory() throws GrouperException {
if (history == null) {
try {
history = MembershipRequestHistoryFinder.findHistory(group.getSession(), group, requestorId);
} catch (QueryException e) {
throw new GrouperException("Unable to fetch membershiprequest history: " + e.getMessage(), e);
}
}
return this.history;
}
private void setHistory(ArrayList<MembershipRequestHistory> history) {
this.history = history;
}
public static MembershipRequest create(Group group, String requestor) throws MembershipRequestAddException {
try {
MembershipRequest m = new MembershipRequest(group, requestor);
GridGrouperHibernateHelper.save(m);
MembershipRequestHistory membershipRequestHistory = new MembershipRequestHistory(m);
GridGrouperHibernateHelper.save(membershipRequestHistory);
m.history = new ArrayList<MembershipRequestHistory>();
m.history.add(membershipRequestHistory);
return m;
} catch (HibernateException eH) {
throw new MembershipRequestAddException("unable to save membershiprequest: " + eH.getMessage(), eH);
}
}
public static void configureGroup(GrouperSession session, Group grp) throws InsufficientPrivilegeException,
SchemaException, GroupModifyException, GrouperException {
GroupType membershipRequestGroupType = null;
try {
membershipRequestGroupType = GroupTypeFinder.find("MembershipRequests");
} catch (SchemaException eS) {
membershipRequestGroupType = createType();
}
Set<?> groupTypes = grp.getTypes();
if (!groupTypes.contains(membershipRequestGroupType)) {
grp.addType(membershipRequestGroupType);
}
}
public static void markAllRequestsRemoved(GrouperSession session, Member rejector, Group group, String note) throws MembershipRequestUpdateException, InsufficientPrivilegeException, SubjectNotFoundException, GrouperException {
MembershipRequestValidator.canUpdateRequest(group, rejector.getSubject());
ArrayList<MembershipRequest> requests;
try {
requests = MembershipRequestFinder.findRequestsByStatus(session, group, MembershipRequestStatus.Pending);
} catch (QueryException e) {
throw new MembershipRequestUpdateException("Unable to approve membershiprequest: " + e.getMessage(), e);
}
for (MembershipRequest membershipRequest : requests) {
membershipRequest.remove(rejector, note, null);
}
}
public void approve(Member approver, String publicNote, String adminNote) throws MembershipRequestUpdateException, InsufficientPrivilegeException, GrouperException {
try {
MembershipRequestValidator.canUpdateRequest(this.group, approver.getSubject());
this.status = MembershipRequestStatus.Approved;
this.reviewer = approver;
this.publicNote = publicNote;
this.adminNote = adminNote;
this.reviewTime = System.currentTimeMillis();
GridGrouperHibernateHelper.save(this);
MembershipRequestHistory membershipRequestHistory = new MembershipRequestHistory(this);
GridGrouperHibernateHelper.save(membershipRequestHistory);
getHistory().add(membershipRequestHistory);
} catch (HibernateException eH) {
throw new MembershipRequestUpdateException("Unable to approve membershiprequest: " + eH.getMessage(), eH);
} catch (SubjectNotFoundException e) {
throw new MembershipRequestUpdateException("Unable to approve membershiprequest: " + e.getMessage(), e);
}
}
public void pending() throws MembershipRequestUpdateException, GrouperException {
this.status = MembershipRequestStatus.Pending;
this.publicNote = "Request Resubmitted. " + this.publicNote;
this.reviewTime = 0;
try {
GridGrouperHibernateHelper.save(this);
MembershipRequestHistory membershipRequestHistory = new MembershipRequestHistory(this);
GridGrouperHibernateHelper.save(membershipRequestHistory);
getHistory().add(membershipRequestHistory);
} catch (HibernateException eH) {
throw new MembershipRequestUpdateException("Unable to change membershiprequest to pending: " + eH.getMessage(), eH);
}
}
public void reject(Member rejector, String publicNote, String adminNote) throws MembershipRequestUpdateException, InsufficientPrivilegeException, GrouperException {
try {
MembershipRequestValidator.canUpdateRequest(this.group, rejector.getSubject());
if (!MembershipRequestStatus.Pending.equals(this.status)) {
throw new MembershipRequestUpdateException("Only pending membership requests can be rejected");
}
this.status = MembershipRequestStatus.Rejected;
this.reviewer = rejector;
this.publicNote = publicNote;
this.adminNote = adminNote;
this.reviewTime = System.currentTimeMillis();
GridGrouperHibernateHelper.save(this);
MembershipRequestHistory membershipRequestHistory = new MembershipRequestHistory(this);
GridGrouperHibernateHelper.save(membershipRequestHistory);
getHistory().add(membershipRequestHistory);
} catch (HibernateException eH) {
throw new MembershipRequestUpdateException("Unable to reject membershiprequest: " + eH.getMessage(), eH);
} catch (SubjectNotFoundException e) {
throw new MembershipRequestUpdateException("Unable to reject membershiprequest: " + e.getMessage(), e);
}
}
public void remove(Member approver, String publicNote, String adminNote) throws MembershipRequestUpdateException, InsufficientPrivilegeException, GrouperException {
try {
MembershipRequestValidator.canUpdateRequest(this.group, approver.getSubject());
this.status = MembershipRequestStatus.Removed;
this.reviewer = approver;
this.publicNote = publicNote;
this.adminNote = adminNote;
this.reviewTime = System.currentTimeMillis();
GridGrouperHibernateHelper.save(this);
MembershipRequestHistory membershipRequestHistory = new MembershipRequestHistory(this);
GridGrouperHibernateHelper.save(membershipRequestHistory);
getHistory().add(membershipRequestHistory);
} catch (HibernateException eH) {
throw new MembershipRequestUpdateException("Unable to remove membershiprequest: " + eH.getMessage(), eH);
} catch (SubjectNotFoundException e) {
throw new MembershipRequestUpdateException("Unable to remove membershiprequest: " + e.getMessage(), e);
}
}
private static GroupType createType() throws GrouperException {
Set set = new LinkedHashSet();
Field field = new Field("allowMembershipRequests", FieldType.ATTRIBUTE, Privilege.getInstance("view"), Privilege.getInstance("admin"), false);
set.add(field);
GroupType gt = new GroupType("MembershipRequests", set, true, false);
try {
GridGrouperHibernateHelper.save(gt);
} catch (HibernateException eH) {
throw new GrouperException("Unable to create membershiprequest group type: " + eH.getMessage(), eH);
}
return gt;
}
}