package hu.sch.web.rest.dto;
import hu.sch.domain.Membership;
import hu.sch.domain.Post;
import hu.sch.domain.user.User;
import hu.sch.services.MembershipManagerLocal;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.lang3.StringUtils;
/**
*
* @author tomi
*/
public class EntitlementProducer {
private static final String URN_SEPARATOR = ":";
// github/#88 - auth.sch needs semicolon as the separator, instead of a pipe
private static final String ENTITLEMENT_SEPARATOR = ";";
private static final String ENTITLEMENT_PREFIX = "urn:geant:niif.hu:sch.bme.hu:entitlement:";
private static final String MEMBER = "tag";
// FIXME: #86 remove magic ids
private static final Long MEMBERSHIP_PROCESSING_ID = 6L;
private User user;
private MembershipManagerLocal membershipManager;
public EntitlementProducer(User user, MembershipManagerLocal membershipManager) {
this.user = user;
this.membershipManager = membershipManager;
}
public String createEntitlement() {
List<String> entitlementStrings = listEntitlements();
if (entitlementStrings.isEmpty()) {
return null;
}
return StringUtils.join(entitlementStrings, ENTITLEMENT_SEPARATOR);
}
private List<String> listEntitlements() {
List<String> result = new ArrayList<>();
List<Membership> memberships = membershipManager.findMembershipsForUser(user);
for (Membership membership : memberships) {
// for a memberships under review user does not get 'tag' entitlement
if (!isMembershipUnderReview(membership)) {
// everybody has the 'tag' entitlement
result.add(getEntitlementString(membership, MEMBER));
}
for (Post post : membership.getPosts()) {
result.add(getEntitlementString(membership, post.getPostType().getPostName()));
}
}
return result;
}
private String getEntitlementString(Membership ms, String post) {
StringBuilder sb = new StringBuilder();
sb.append(ENTITLEMENT_PREFIX);
sb.append(post);
sb.append(URN_SEPARATOR);
sb.append(ms.getGroup().getName());
sb.append(URN_SEPARATOR);
sb.append(ms.getGroupId());
return sb.toString();
}
private boolean isMembershipUnderReview(Membership ms) {
for (Post post : ms.getPosts()) {
if (MEMBERSHIP_PROCESSING_ID.equals(post.getPostType().getId())) {
return true;
}
}
return false;
}
}