Use enum class to group repository/user operations.

This commit is contained in:
robin shine 2013-09-21 16:24:07 +08:00
parent cae54c3288
commit e2b33f6adf
16 changed files with 117 additions and 119 deletions

View File

@ -4,14 +4,14 @@ import java.util.Collection;
import com.pmease.gitop.core.model.MergeRequest;
import com.pmease.gitop.core.model.User;
import com.pmease.gitop.core.permission.operation.Write;
import com.pmease.gitop.core.permission.operation.RepositoryOperation;
@SuppressWarnings("serial")
public class ApprovedByAuthorizedUsers extends AbstractGateKeeper {
@Override
public CheckResult check(MergeRequest request) {
Collection<User> authorizedUsers = request.getDestination().getRepository().findAuthorizedUsers(new Write());
Collection<User> authorizedUsers = request.getDestination().getRepository().findAuthorizedUsers(RepositoryOperation.WRITE);
OrGateKeeper or = new OrGateKeeper();
for (User user: authorizedUsers) {
ApprovedBySpecifiedUser entry = new ApprovedBySpecifiedUser();

View File

@ -3,9 +3,9 @@ package com.pmease.gitop.core.manager;
import com.google.inject.ImplementedBy;
import com.pmease.commons.hibernate.dao.GenericDao;
import com.pmease.gitop.core.manager.impl.DefaultAuthorizationManager;
import com.pmease.gitop.core.model.Authorization;
import com.pmease.gitop.core.model.RepositoryAuthorization;
@ImplementedBy(DefaultAuthorizationManager.class)
public interface AuthorizationManager extends GenericDao<Authorization> {
public interface AuthorizationManager extends GenericDao<RepositoryAuthorization> {
}

View File

@ -6,10 +6,10 @@ import javax.inject.Singleton;
import com.pmease.commons.hibernate.dao.DefaultGenericDao;
import com.pmease.commons.hibernate.dao.GeneralDao;
import com.pmease.gitop.core.manager.AuthorizationManager;
import com.pmease.gitop.core.model.Authorization;
import com.pmease.gitop.core.model.RepositoryAuthorization;
@Singleton
public class DefaultAuthorizationManager extends DefaultGenericDao<Authorization> implements AuthorizationManager {
public class DefaultAuthorizationManager extends DefaultGenericDao<RepositoryAuthorization> implements AuthorizationManager {
@Inject
public DefaultAuthorizationManager(GeneralDao generalDao) {

View File

@ -18,7 +18,7 @@ import com.pmease.commons.hibernate.AbstractEntity;
import com.pmease.gitop.core.gatekeeper.GateKeeper;
import com.pmease.gitop.core.permission.object.ProtectedObject;
import com.pmease.gitop.core.permission.object.UserBelonging;
import com.pmease.gitop.core.permission.operation.PrivilegedOperation;
import com.pmease.gitop.core.permission.operation.RepositoryOperation;
@Entity
@Table(uniqueConstraints={
@ -39,7 +39,7 @@ public class Repository extends AbstractEntity implements UserBelonging {
private GateKeeper gateKeeper;
@OneToMany(mappedBy="repository")
private Collection<Authorization> authorizations = new ArrayList<Authorization>();
private Collection<RepositoryAuthorization> authorizations = new ArrayList<RepositoryAuthorization>();
public User getOwner() {
return owner;
@ -80,11 +80,11 @@ public class Repository extends AbstractEntity implements UserBelonging {
return getOwner();
}
public Collection<Authorization> getAuthorizations() {
public Collection<RepositoryAuthorization> getAuthorizations() {
return authorizations;
}
public void setAuthorizations(Collection<Authorization> authorizations) {
public void setAuthorizations(Collection<RepositoryAuthorization> authorizations) {
this.authorizations = authorizations;
}
@ -98,10 +98,10 @@ public class Repository extends AbstractEntity implements UserBelonging {
}
}
public Collection<User> findAuthorizedUsers(PrivilegedOperation operation) {
public Collection<User> findAuthorizedUsers(RepositoryOperation operation) {
Map<Long, Boolean> authorizationMap = new HashMap<Long, Boolean>();
for (Authorization authorization: getAuthorizations()) {
authorizationMap.put(authorization.getTeam().getId(), authorization.getOperation().can(operation));
for (RepositoryAuthorization authorization: getAuthorizations()) {
authorizationMap.put(authorization.getTeam().getId(), authorization.getAuthorizedOperation().can(operation));
}
Collection<Team> teams = new HashSet<Team>();
@ -113,7 +113,7 @@ public class Repository extends AbstractEntity implements UserBelonging {
else
continue;
} else {
if (team.getOperation().can(operation))
if (team.getAuthorizedOperation().can(operation))
teams.add(team);
}
}

View File

@ -7,15 +7,14 @@ import javax.persistence.Table;
import javax.persistence.UniqueConstraint;
import com.pmease.commons.hibernate.AbstractEntity;
import com.pmease.gitop.core.permission.operation.PrivilegedOperation;
import com.pmease.gitop.core.permission.operation.Read;
import com.pmease.gitop.core.permission.operation.RepositoryOperation;
@SuppressWarnings("serial")
@Entity
@Table(uniqueConstraints={
@UniqueConstraint(columnNames={"team", "repository"})
})
public class Authorization extends AbstractEntity {
public class RepositoryAuthorization extends AbstractEntity {
@ManyToOne
@JoinColumn(nullable=false)
@ -25,14 +24,14 @@ public class Authorization extends AbstractEntity {
@JoinColumn(nullable=false)
private Repository repository;
private PrivilegedOperation operation = new Read();
private RepositoryOperation authorizedOperation = RepositoryOperation.READ;
public PrivilegedOperation getOperation() {
return operation;
public RepositoryOperation getAuthorizedOperation() {
return authorizedOperation;
}
public void setOperation(PrivilegedOperation operation) {
this.operation = operation;
public void setAuthorizedOperation(RepositoryOperation authorizedOperation) {
this.authorizedOperation = authorizedOperation;
}
public Team getTeam() {

View File

@ -15,8 +15,7 @@ import org.apache.shiro.authz.Permission;
import com.pmease.commons.hibernate.AbstractEntity;
import com.pmease.gitop.core.permission.ObjectPermission;
import com.pmease.gitop.core.permission.operation.PrivilegedOperation;
import com.pmease.gitop.core.permission.operation.Read;
import com.pmease.gitop.core.permission.operation.UserOperation;
@Entity
@Table(uniqueConstraints={
@ -39,13 +38,13 @@ public class Team extends AbstractEntity implements Permission {
private boolean register;
@Column(nullable=false)
private PrivilegedOperation operation = new Read();
private UserOperation authorizedOperation = UserOperation.READ;
@OneToMany(mappedBy="team")
private Collection<TeamMembership> memberships = new ArrayList<TeamMembership>();
@OneToMany(mappedBy="team")
private Collection<Authorization> authorizations = new ArrayList<Authorization>();
private Collection<RepositoryAuthorization> repositoryAuthorizations = new ArrayList<RepositoryAuthorization>();
public User getOwner() {
return owner;
@ -87,12 +86,12 @@ public class Team extends AbstractEntity implements Permission {
this.register = register;
}
public PrivilegedOperation getOperation() {
return operation;
public UserOperation getAuthorizedOperation() {
return authorizedOperation;
}
public void setOperation(PrivilegedOperation operation) {
this.operation = operation;
public void setAuthorizedOperation(UserOperation authorizedOeration) {
this.authorizedOperation = authorizedOeration;
}
public Collection<TeamMembership> getMemberships() {
@ -103,12 +102,12 @@ public class Team extends AbstractEntity implements Permission {
this.memberships = memberships;
}
public Collection<Authorization> getAuthorizations() {
return authorizations;
public Collection<RepositoryAuthorization> getRepositoryAuthorizations() {
return repositoryAuthorizations;
}
public void setAuthorizations(Collection<Authorization> authorizations) {
this.authorizations = authorizations;
public void setAuthorizations(Collection<RepositoryAuthorization> repositoryAuthorizations) {
this.repositoryAuthorizations = repositoryAuthorizations;
}
@Override
@ -116,13 +115,13 @@ public class Team extends AbstractEntity implements Permission {
if (permission instanceof ObjectPermission) {
ObjectPermission objectPermission = (ObjectPermission) permission;
for (Authorization each: getAuthorizations()) {
for (RepositoryAuthorization each: getRepositoryAuthorizations()) {
if (each.getRepository().has(objectPermission.getObject()))
return each.getOperation().can(objectPermission.getOperation());
return each.getAuthorizedOperation().can(objectPermission.getOperation());
}
if (getOwner().has(objectPermission.getObject()))
return getOperation().can(objectPermission.getOperation());
return getAuthorizedOperation().can(objectPermission.getOperation());
}
return false;

View File

@ -6,10 +6,10 @@ import com.pmease.gitop.core.model.Repository;
import com.pmease.gitop.core.model.User;
import com.pmease.gitop.core.permission.object.ProtectedObject;
import com.pmease.gitop.core.permission.object.SystemObject;
import com.pmease.gitop.core.permission.operation.Administration;
import com.pmease.gitop.core.permission.operation.PrivilegedOperation;
import com.pmease.gitop.core.permission.operation.Read;
import com.pmease.gitop.core.permission.operation.Write;
import com.pmease.gitop.core.permission.operation.RepositoryOperation;
import com.pmease.gitop.core.permission.operation.SystemOperation;
import com.pmease.gitop.core.permission.operation.UserOperation;
/**
* This class represents permissions to operate an account and its belongings.
@ -56,30 +56,30 @@ public class ObjectPermission implements Permission {
}
public static ObjectPermission ofUserAdmin(User user) {
return new ObjectPermission(user, new Administration());
return new ObjectPermission(user, UserOperation.ADMINISTRATION);
}
public static ObjectPermission ofUserRead(User user) {
return new ObjectPermission(user, new Read());
return new ObjectPermission(user, UserOperation.READ);
}
public static ObjectPermission ofUserWrite(User user) {
return new ObjectPermission(user, new Write());
return new ObjectPermission(user, UserOperation.WRITE);
}
public static ObjectPermission ofRepositoryAdmin(Repository repository) {
return new ObjectPermission(repository, new Administration());
return new ObjectPermission(repository, RepositoryOperation.ADMINISTRATION);
}
public static ObjectPermission ofRepositoryRead(Repository repository) {
return new ObjectPermission(repository, new Read());
return new ObjectPermission(repository, RepositoryOperation.READ);
}
public static ObjectPermission ofRepositoryWrite(Repository repository) {
return new ObjectPermission(repository, new Write());
return new ObjectPermission(repository, RepositoryOperation.WRITE);
}
public static ObjectPermission ofSystem(PrivilegedOperation operation) {
public static ObjectPermission ofSystem(SystemOperation operation) {
return new ObjectPermission(new SystemObject(), operation);
}

View File

@ -1,11 +0,0 @@
package com.pmease.gitop.core.permission.operation;
@SuppressWarnings("serial")
public class Administration implements PrivilegedOperation {
@Override
public boolean can(PrivilegedOperation operation) {
return true;
}
}

View File

@ -1,11 +0,0 @@
package com.pmease.gitop.core.permission.operation;
@SuppressWarnings("serial")
public class CreateMergeRequest implements PrivilegedOperation {
@Override
public boolean can(PrivilegedOperation operation) {
return operation instanceof CreateMergeRequest;
}
}

View File

@ -1,11 +0,0 @@
package com.pmease.gitop.core.permission.operation;
@SuppressWarnings("serial")
public class CreateRepository implements PrivilegedOperation {
@Override
public boolean can(PrivilegedOperation operation) {
return operation instanceof CreateRepository;
}
}

View File

@ -1,11 +0,0 @@
package com.pmease.gitop.core.permission.operation;
@SuppressWarnings("serial")
public class NoAccess implements PrivilegedOperation {
@Override
public boolean can(PrivilegedOperation operation) {
return false;
}
}

View File

@ -1,11 +0,0 @@
package com.pmease.gitop.core.permission.operation;
@SuppressWarnings("serial")
public class Read implements PrivilegedOperation {
@Override
public boolean can(PrivilegedOperation operation) {
return operation instanceof Read;
}
}

View File

@ -0,0 +1,36 @@
package com.pmease.gitop.core.permission.operation;
public enum RepositoryOperation implements PrivilegedOperation {
NO_ACCESS {
@Override
public boolean can(PrivilegedOperation operation) {
return false;
}
},
READ {
@Override
public boolean can(PrivilegedOperation operation) {
return operation == READ;
}
},
WRITE {
@Override
public boolean can(PrivilegedOperation operation) {
return operation == WRITE || READ.can(operation);
}
},
ADMINISTRATION {
@Override
public boolean can(PrivilegedOperation operation) {
return true;
}
}
}

View File

@ -9,19 +9,19 @@ public enum SystemOperation implements PrivilegedOperation {
}
},
CREATE_ASSESSMENT {
VOTE {
@Override
public boolean can(PrivilegedOperation operation) {
return operation == CREATE_ASSESSMENT;
return operation == VOTE;
}
},
CREATE_COMMENT {
ADD_COMMENT {
@Override
public boolean can(PrivilegedOperation operation) {
return operation == CREATE_COMMENT;
return operation == ADD_COMMENT;
}
},
@ -45,7 +45,7 @@ public enum SystemOperation implements PrivilegedOperation {
@Override
public boolean can(PrivilegedOperation operation) {
return operation == READ_ALL_REPOSITORIES;
return operation == READ_ALL_REPOSITORIES || RepositoryOperation.READ.can(operation);
}
},
@ -53,7 +53,9 @@ public enum SystemOperation implements PrivilegedOperation {
@Override
public boolean can(PrivilegedOperation operation) {
return READ_ALL_REPOSITORIES.can(operation);
return operation == WRITE_ALL_REPOSITORIES
|| READ_ALL_REPOSITORIES.can(operation)
|| RepositoryOperation.WRITE.can(operation);
}
}

View File

@ -0,0 +1,28 @@
package com.pmease.gitop.core.permission.operation;
public enum UserOperation implements PrivilegedOperation {
READ {
@Override
public boolean can(PrivilegedOperation operation) {
return operation == READ || RepositoryOperation.READ.can(operation);
}
},
WRITE {
@Override
public boolean can(PrivilegedOperation operation) {
return operation == WRITE || READ.can(operation) || RepositoryOperation.WRITE.can(operation);
}
},
ADMINISTRATION {
@Override
public boolean can(PrivilegedOperation operation) {
return true;
}
}
}

View File

@ -1,11 +0,0 @@
package com.pmease.gitop.core.permission.operation;
@SuppressWarnings("serial")
public class Write implements PrivilegedOperation{
@Override
public boolean can(PrivilegedOperation operation) {
return operation instanceof Write || new Read().can(operation);
}
}