1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.syncope.core.persistence.jpa.entity;
20
21 import com.fasterxml.jackson.core.type.TypeReference;
22 import java.util.ArrayList;
23 import java.util.HashSet;
24 import java.util.List;
25 import java.util.Set;
26 import java.util.stream.Collectors;
27 import javax.persistence.Cacheable;
28 import javax.persistence.CascadeType;
29 import javax.persistence.Entity;
30 import javax.persistence.FetchType;
31 import javax.persistence.JoinColumn;
32 import javax.persistence.JoinTable;
33 import javax.persistence.Lob;
34 import javax.persistence.ManyToMany;
35 import javax.persistence.OneToOne;
36 import javax.persistence.PostLoad;
37 import javax.persistence.PostPersist;
38 import javax.persistence.PostUpdate;
39 import javax.persistence.PrePersist;
40 import javax.persistence.PreUpdate;
41 import javax.persistence.Table;
42 import javax.persistence.Transient;
43 import javax.persistence.UniqueConstraint;
44 import javax.validation.Valid;
45 import org.apache.syncope.core.persistence.api.entity.Application;
46 import org.apache.syncope.core.persistence.api.entity.DynRealm;
47 import org.apache.syncope.core.persistence.api.entity.Privilege;
48 import org.apache.syncope.core.persistence.api.entity.Realm;
49 import org.apache.syncope.core.persistence.api.entity.Role;
50 import org.apache.syncope.core.persistence.api.entity.user.DynRoleMembership;
51 import org.apache.syncope.core.persistence.jpa.entity.user.JPADynRoleMembership;
52 import org.apache.syncope.core.persistence.jpa.validation.entity.RoleCheck;
53 import org.apache.syncope.core.provisioning.api.serialization.POJOHelper;
54
55 @Entity
56 @Table(name = JPARole.TABLE)
57 @Cacheable
58 @RoleCheck
59 public class JPARole extends AbstractProvidedKeyEntity implements Role {
60
61 private static final long serialVersionUID = -7657701119422588832L;
62
63 public static final String TABLE = "SyncopeRole";
64
65 protected static final TypeReference<Set<String>> TYPEREF = new TypeReference<Set<String>>() {
66 };
67
68 @Lob
69 private String entitlements;
70
71 @Transient
72 private Set<String> entitlementsSet = new HashSet<>();
73
74 @ManyToMany(fetch = FetchType.EAGER)
75 @JoinTable(joinColumns =
76 @JoinColumn(name = "role_id"),
77 inverseJoinColumns =
78 @JoinColumn(name = "realm_id"),
79 uniqueConstraints =
80 @UniqueConstraint(columnNames = { "role_id", "realm_id" }))
81 @Valid
82 private List<JPARealm> realms = new ArrayList<>();
83
84 @ManyToMany(fetch = FetchType.EAGER)
85 @JoinTable(joinColumns =
86 @JoinColumn(name = "role_id"),
87 inverseJoinColumns =
88 @JoinColumn(name = "dynamicRealm_id"),
89 uniqueConstraints =
90 @UniqueConstraint(columnNames = { "role_id", "dynamicRealm_id" }))
91 @Valid
92 private List<JPADynRealm> dynRealms = new ArrayList<>();
93
94 @OneToOne(cascade = CascadeType.ALL, orphanRemoval = true, mappedBy = "role")
95 @Valid
96 private JPADynRoleMembership dynMembership;
97
98 @Lob
99 private String anyLayout;
100
101 @ManyToMany(fetch = FetchType.EAGER)
102 @JoinTable(joinColumns =
103 @JoinColumn(name = "role_id"),
104 inverseJoinColumns =
105 @JoinColumn(name = "privilege_id"),
106 uniqueConstraints =
107 @UniqueConstraint(columnNames = { "role_id", "privilege_id" }))
108 @Valid
109 private Set<JPAPrivilege> privileges = new HashSet<>();
110
111 @Override
112 public Set<String> getEntitlements() {
113 return entitlementsSet;
114 }
115
116 @Override
117 public boolean add(final Realm realm) {
118 checkType(realm, JPARealm.class);
119 return realms.contains((JPARealm) realm) || realms.add((JPARealm) realm);
120 }
121
122 @Override
123 public List<? extends Realm> getRealms() {
124 return realms;
125 }
126
127 @Override
128 public boolean add(final DynRealm dynamicRealm) {
129 checkType(dynamicRealm, JPADynRealm.class);
130 return dynRealms.contains((JPADynRealm) dynamicRealm) || dynRealms.add((JPADynRealm) dynamicRealm);
131 }
132
133 @Override
134 public List<? extends DynRealm> getDynRealms() {
135 return dynRealms;
136 }
137
138 @Override
139 public DynRoleMembership getDynMembership() {
140 return dynMembership;
141 }
142
143 @Override
144 public void setDynMembership(final DynRoleMembership dynMembership) {
145 checkType(dynMembership, JPADynRoleMembership.class);
146 this.dynMembership = (JPADynRoleMembership) dynMembership;
147 }
148
149 @Override
150 public String getAnyLayout() {
151 return anyLayout;
152 }
153
154 @Override
155 public void setAnyLayout(final String anyLayout) {
156 this.anyLayout = anyLayout;
157 }
158
159 @Override
160 public boolean add(final Privilege privilege) {
161 checkType(privilege, JPAPrivilege.class);
162 return privileges.add((JPAPrivilege) privilege);
163 }
164
165 @Override
166 public Set<? extends Privilege> getPrivileges(final Application application) {
167 return privileges.stream().
168 filter(privilege -> privilege.getApplication().equals(application)).
169 collect(Collectors.toSet());
170 }
171
172 @Override
173 public Set<? extends Privilege> getPrivileges() {
174 return privileges;
175 }
176
177 protected void json2list(final boolean clearFirst) {
178 if (clearFirst) {
179 getEntitlements().clear();
180 }
181 if (entitlements != null) {
182 getEntitlements().addAll(
183 POJOHelper.deserialize(entitlements, TYPEREF));
184 }
185 }
186
187 @PostLoad
188 public void postLoad() {
189 json2list(false);
190 }
191
192 @PostPersist
193 @PostUpdate
194 public void postSave() {
195 json2list(true);
196 }
197
198 @PrePersist
199 @PreUpdate
200 public void list2json() {
201 entitlements = POJOHelper.serialize(getEntitlements());
202 }
203 }