View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one
3    * or more contributor license agreements.  See the NOTICE file
4    * distributed with this work for additional information
5    * regarding copyright ownership.  The ASF licenses this file
6    * to you under the Apache License, Version 2.0 (the
7    * "License"); you may not use this file except in compliance
8    * with the License.  You may obtain a copy of the License at
9    *
10   *   http://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing,
13   * software distributed under the License is distributed on an
14   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15   * KIND, either express or implied.  See the License for the
16   * specific language governing permissions and limitations
17   * under the License.
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 }