package org.dddlib.organisation.security.domain;
import org.dayatang.security.domain.AuthorizationScope;
import org.dddlib.organisation.domain.Organization;
import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;
import javax.persistence.ManyToOne;
import javax.validation.constraints.NotNull;
import java.util.Date;
import java.util.HashSet;
import java.util.Objects;
import java.util.Set;
/**
* 机构授权范围。由一个机构代表的授权范围。机构间的直线管理关系映射到授权范围的包含与被包含关系
* Created by yyang on 15/8/17.
*/
@Entity
@DiscriminatorValue("ORG")
public class OrgAuthorizationScope extends AuthorizationScope {
@NotNull
@ManyToOne
private Organization organization;
protected OrgAuthorizationScope() {
}
public OrgAuthorizationScope(Organization organization) {
super(organization.getName());
this.organization = organization;
}
public OrgAuthorizationScope(String name, Organization organization) {
super(name);
this.organization = organization;
}
public Organization getOrganization() {
return organization;
}
@Override
public OrgAuthorizationScope getParent() {
Date now = new Date();
Organization parent = organization.getParent(now);
if (parent == null) {
return null;
}
return of(parent);
}
@Override
public Set<OrgAuthorizationScope> getChildren() {
Date now = new Date();
Set<OrgAuthorizationScope> results = new HashSet<OrgAuthorizationScope>();
for (Organization child : organization.getChildren(now)) {
results.add(of(child));
}
return results;
}
/**
* 获取代表指定机构的授权范围。如果不存在则创建一个
* @param organization 机构
* @return 代表该机构的机构授权范围
*/
public static OrgAuthorizationScope of(Organization organization) {
OrgAuthorizationScope scope = createCriteriaQuery(OrgAuthorizationScope.class)
.eq("organization", organization)
.isFalse("disabled")
.singleResult();
if (scope == null) {
scope = new OrgAuthorizationScope(organization);
scope.save();
}
return scope;
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (!(o instanceof OrgAuthorizationScope)) {
return false;
}
OrgAuthorizationScope that = (OrgAuthorizationScope) o;
return Objects.equals(getOrganization(), that.getOrganization());
}
@Override
public int hashCode() {
return Objects.hash(getOrganization());
}
}