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.MergeRequest;
import com.pmease.gitop.core.model.User; 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") @SuppressWarnings("serial")
public class ApprovedByAuthorizedUsers extends AbstractGateKeeper { public class ApprovedByAuthorizedUsers extends AbstractGateKeeper {
@Override @Override
public CheckResult check(MergeRequest request) { 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(); OrGateKeeper or = new OrGateKeeper();
for (User user: authorizedUsers) { for (User user: authorizedUsers) {
ApprovedBySpecifiedUser entry = new ApprovedBySpecifiedUser(); ApprovedBySpecifiedUser entry = new ApprovedBySpecifiedUser();

View File

@ -3,9 +3,9 @@ package com.pmease.gitop.core.manager;
import com.google.inject.ImplementedBy; import com.google.inject.ImplementedBy;
import com.pmease.commons.hibernate.dao.GenericDao; import com.pmease.commons.hibernate.dao.GenericDao;
import com.pmease.gitop.core.manager.impl.DefaultAuthorizationManager; 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) @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.DefaultGenericDao;
import com.pmease.commons.hibernate.dao.GeneralDao; import com.pmease.commons.hibernate.dao.GeneralDao;
import com.pmease.gitop.core.manager.AuthorizationManager; import com.pmease.gitop.core.manager.AuthorizationManager;
import com.pmease.gitop.core.model.Authorization; import com.pmease.gitop.core.model.RepositoryAuthorization;
@Singleton @Singleton
public class DefaultAuthorizationManager extends DefaultGenericDao<Authorization> implements AuthorizationManager { public class DefaultAuthorizationManager extends DefaultGenericDao<RepositoryAuthorization> implements AuthorizationManager {
@Inject @Inject
public DefaultAuthorizationManager(GeneralDao generalDao) { 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.gatekeeper.GateKeeper;
import com.pmease.gitop.core.permission.object.ProtectedObject; import com.pmease.gitop.core.permission.object.ProtectedObject;
import com.pmease.gitop.core.permission.object.UserBelonging; 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 @Entity
@Table(uniqueConstraints={ @Table(uniqueConstraints={
@ -39,7 +39,7 @@ public class Repository extends AbstractEntity implements UserBelonging {
private GateKeeper gateKeeper; private GateKeeper gateKeeper;
@OneToMany(mappedBy="repository") @OneToMany(mappedBy="repository")
private Collection<Authorization> authorizations = new ArrayList<Authorization>(); private Collection<RepositoryAuthorization> authorizations = new ArrayList<RepositoryAuthorization>();
public User getOwner() { public User getOwner() {
return owner; return owner;
@ -80,11 +80,11 @@ public class Repository extends AbstractEntity implements UserBelonging {
return getOwner(); return getOwner();
} }
public Collection<Authorization> getAuthorizations() { public Collection<RepositoryAuthorization> getAuthorizations() {
return authorizations; return authorizations;
} }
public void setAuthorizations(Collection<Authorization> authorizations) { public void setAuthorizations(Collection<RepositoryAuthorization> authorizations) {
this.authorizations = 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>(); Map<Long, Boolean> authorizationMap = new HashMap<Long, Boolean>();
for (Authorization authorization: getAuthorizations()) { for (RepositoryAuthorization authorization: getAuthorizations()) {
authorizationMap.put(authorization.getTeam().getId(), authorization.getOperation().can(operation)); authorizationMap.put(authorization.getTeam().getId(), authorization.getAuthorizedOperation().can(operation));
} }
Collection<Team> teams = new HashSet<Team>(); Collection<Team> teams = new HashSet<Team>();
@ -113,7 +113,7 @@ public class Repository extends AbstractEntity implements UserBelonging {
else else
continue; continue;
} else { } else {
if (team.getOperation().can(operation)) if (team.getAuthorizedOperation().can(operation))
teams.add(team); teams.add(team);
} }
} }

View File

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

View File

@ -15,8 +15,7 @@ import org.apache.shiro.authz.Permission;
import com.pmease.commons.hibernate.AbstractEntity; import com.pmease.commons.hibernate.AbstractEntity;
import com.pmease.gitop.core.permission.ObjectPermission; import com.pmease.gitop.core.permission.ObjectPermission;
import com.pmease.gitop.core.permission.operation.PrivilegedOperation; import com.pmease.gitop.core.permission.operation.UserOperation;
import com.pmease.gitop.core.permission.operation.Read;
@Entity @Entity
@Table(uniqueConstraints={ @Table(uniqueConstraints={
@ -39,13 +38,13 @@ public class Team extends AbstractEntity implements Permission {
private boolean register; private boolean register;
@Column(nullable=false) @Column(nullable=false)
private PrivilegedOperation operation = new Read(); private UserOperation authorizedOperation = UserOperation.READ;
@OneToMany(mappedBy="team") @OneToMany(mappedBy="team")
private Collection<TeamMembership> memberships = new ArrayList<TeamMembership>(); private Collection<TeamMembership> memberships = new ArrayList<TeamMembership>();
@OneToMany(mappedBy="team") @OneToMany(mappedBy="team")
private Collection<Authorization> authorizations = new ArrayList<Authorization>(); private Collection<RepositoryAuthorization> repositoryAuthorizations = new ArrayList<RepositoryAuthorization>();
public User getOwner() { public User getOwner() {
return owner; return owner;
@ -87,12 +86,12 @@ public class Team extends AbstractEntity implements Permission {
this.register = register; this.register = register;
} }
public PrivilegedOperation getOperation() { public UserOperation getAuthorizedOperation() {
return operation; return authorizedOperation;
} }
public void setOperation(PrivilegedOperation operation) { public void setAuthorizedOperation(UserOperation authorizedOeration) {
this.operation = operation; this.authorizedOperation = authorizedOeration;
} }
public Collection<TeamMembership> getMemberships() { public Collection<TeamMembership> getMemberships() {
@ -103,12 +102,12 @@ public class Team extends AbstractEntity implements Permission {
this.memberships = memberships; this.memberships = memberships;
} }
public Collection<Authorization> getAuthorizations() { public Collection<RepositoryAuthorization> getRepositoryAuthorizations() {
return authorizations; return repositoryAuthorizations;
} }
public void setAuthorizations(Collection<Authorization> authorizations) { public void setAuthorizations(Collection<RepositoryAuthorization> repositoryAuthorizations) {
this.authorizations = authorizations; this.repositoryAuthorizations = repositoryAuthorizations;
} }
@Override @Override
@ -116,13 +115,13 @@ public class Team extends AbstractEntity implements Permission {
if (permission instanceof ObjectPermission) { if (permission instanceof ObjectPermission) {
ObjectPermission objectPermission = (ObjectPermission) permission; ObjectPermission objectPermission = (ObjectPermission) permission;
for (Authorization each: getAuthorizations()) { for (RepositoryAuthorization each: getRepositoryAuthorizations()) {
if (each.getRepository().has(objectPermission.getObject())) if (each.getRepository().has(objectPermission.getObject()))
return each.getOperation().can(objectPermission.getOperation()); return each.getAuthorizedOperation().can(objectPermission.getOperation());
} }
if (getOwner().has(objectPermission.getObject())) if (getOwner().has(objectPermission.getObject()))
return getOperation().can(objectPermission.getOperation()); return getAuthorizedOperation().can(objectPermission.getOperation());
} }
return false; 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.model.User;
import com.pmease.gitop.core.permission.object.ProtectedObject; import com.pmease.gitop.core.permission.object.ProtectedObject;
import com.pmease.gitop.core.permission.object.SystemObject; 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.PrivilegedOperation;
import com.pmease.gitop.core.permission.operation.Read; import com.pmease.gitop.core.permission.operation.RepositoryOperation;
import com.pmease.gitop.core.permission.operation.Write; 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. * 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) { public static ObjectPermission ofUserAdmin(User user) {
return new ObjectPermission(user, new Administration()); return new ObjectPermission(user, UserOperation.ADMINISTRATION);
} }
public static ObjectPermission ofUserRead(User user) { public static ObjectPermission ofUserRead(User user) {
return new ObjectPermission(user, new Read()); return new ObjectPermission(user, UserOperation.READ);
} }
public static ObjectPermission ofUserWrite(User user) { public static ObjectPermission ofUserWrite(User user) {
return new ObjectPermission(user, new Write()); return new ObjectPermission(user, UserOperation.WRITE);
} }
public static ObjectPermission ofRepositoryAdmin(Repository repository) { public static ObjectPermission ofRepositoryAdmin(Repository repository) {
return new ObjectPermission(repository, new Administration()); return new ObjectPermission(repository, RepositoryOperation.ADMINISTRATION);
} }
public static ObjectPermission ofRepositoryRead(Repository repository) { public static ObjectPermission ofRepositoryRead(Repository repository) {
return new ObjectPermission(repository, new Read()); return new ObjectPermission(repository, RepositoryOperation.READ);
} }
public static ObjectPermission ofRepositoryWrite(Repository repository) { 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); 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 @Override
public boolean can(PrivilegedOperation operation) { public boolean can(PrivilegedOperation operation) {
return operation == CREATE_ASSESSMENT; return operation == VOTE;
} }
}, },
CREATE_COMMENT { ADD_COMMENT {
@Override @Override
public boolean can(PrivilegedOperation operation) { public boolean can(PrivilegedOperation operation) {
return operation == CREATE_COMMENT; return operation == ADD_COMMENT;
} }
}, },
@ -45,7 +45,7 @@ public enum SystemOperation implements PrivilegedOperation {
@Override @Override
public boolean can(PrivilegedOperation operation) { 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 @Override
public boolean can(PrivilegedOperation operation) { 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);
}
}