package com.taskadapter.redmineapi;
import com.taskadapter.redmineapi.bean.GroupFactory;
import com.taskadapter.redmineapi.bean.Membership;
import com.taskadapter.redmineapi.bean.MembershipFactory;
import com.taskadapter.redmineapi.bean.Project;
import com.taskadapter.redmineapi.bean.ProjectFactory;
import com.taskadapter.redmineapi.bean.Role;
import com.taskadapter.redmineapi.bean.UserFactory;
import com.taskadapter.redmineapi.internal.Transport;
import java.util.Collection;
import java.util.List;
/**
* Works with User-Project Memberships.
* <p>Obtain it via RedmineManager:
* <pre>
RedmineManager mgr = RedmineManagerFactory.createWithUserAuth(redmineURI, login, password);
MembershipManager membershipManager = mgr.getMembershipManager();
* </pre>
*
* <p>Sample usage:
* <pre>
roles = mgr.getUserManager().getRoles();
currentUser = mgr.getUserManager().getCurrentUser();
final Membership membershipForUser = membershipManager.createMembershipForUser(project.getId(), currentUser.getId(), roles);
memberships = membershipManager.getMemberships(project.getId());
membershipManager.delete(membershipForUser);
* </pre>
*
* @see RedmineManager
*/
public class MembershipManager {
private final Transport transport;
MembershipManager(Transport transport) {
this.transport = transport;
}
public List<Membership> getMemberships(String projectKey)
throws RedmineException {
return transport.getChildEntries(Project.class, projectKey, Membership.class);
}
public List<Membership> getMemberships(int projectId) throws RedmineException {
return transport.getChildEntries(Project.class, projectId, Membership.class);
}
/**
* Add a membership.
*
* @param membership
* membership.
* @throws RedmineException
*/
private Membership addMembership(Membership membership) throws RedmineException {
final Project project = membership.getProject();
if (project == null) {
throw new IllegalArgumentException("Project must be set");
}
if (membership.getUser() == null && membership.getRoles().isEmpty()) {
throw new IllegalArgumentException("Either User or Roles field must be set");
}
return transport.addChildEntry(Project.class, project.getId()+"", membership);
}
public Membership getMembership(int membershipId) throws RedmineException {
return transport.getObject(Membership.class, membershipId);
}
public void delete(int membershipId) throws RedmineException {
transport.deleteObject(Membership.class, Integer.toString(membershipId));
}
public void delete(Membership membership) throws RedmineException {
transport.deleteObject(Membership.class, membership.getId().toString());
}
public void update(Membership membership) throws RedmineException {
transport.updateObject(membership);
}
/**
* THIS DOES NOT WORK YET!
* fails on Redmine 2.5.2: apparently, it does not support adding group memberships.
* I submitted bug http://www.redmine.org/issues/17904
*
* This method is here only to show what the future API will look like
*/
@Deprecated
public void createMembershipForGroup(int projectId, int groupId, Collection<Role> roles) throws RedmineException {
final Membership membership = MembershipFactory.create();
final Project project = ProjectFactory.create(projectId);
membership.setProject(project);
membership.setGroup(GroupFactory.create(groupId));
membership.addRoles(roles);
addMembership(membership);
}
public Membership createMembershipForUser(int projectId, int userId, Collection<Role> roles) throws RedmineException {
final Membership membership = MembershipFactory.create();
final Project project = ProjectFactory.create(projectId);
membership.setProject(project);
membership.setUser(UserFactory.create(userId));
membership.addRoles(roles);
return addMembership(membership);
}
}