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.List;
24  import java.util.Optional;
25  import javax.persistence.Basic;
26  import javax.persistence.Cacheable;
27  import javax.persistence.CascadeType;
28  import javax.persistence.Column;
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.validation.constraints.NotNull;
44  import org.apache.commons.lang3.ArrayUtils;
45  import org.apache.syncope.common.lib.to.Item;
46  import org.apache.syncope.common.lib.types.SAML2BindingType;
47  import org.apache.syncope.common.lib.types.SAML2SP4UIImplementationType;
48  import org.apache.syncope.core.persistence.api.entity.Implementation;
49  import org.apache.syncope.core.persistence.api.entity.SAML2SP4UIIdP;
50  import org.apache.syncope.core.persistence.api.entity.SAML2SP4UIUserTemplate;
51  import org.apache.syncope.core.persistence.jpa.validation.entity.SAML2SP4UIIdPCheck;
52  import org.apache.syncope.core.provisioning.api.serialization.POJOHelper;
53  
54  @Entity
55  @Table(name = JPASAML2SP4UIIdP.TABLE)
56  @Cacheable
57  @SAML2SP4UIIdPCheck
58  public class JPASAML2SP4UIIdP extends AbstractGeneratedKeyEntity implements SAML2SP4UIIdP {
59  
60      private static final long serialVersionUID = -392372595500355552L;
61  
62      public static final String TABLE = "SAML2SP4UIIdP";
63  
64      @Column(unique = true, nullable = false)
65      private String entityID;
66  
67      @Column(unique = true, nullable = false)
68      private String name;
69  
70      @Lob
71      @Basic(fetch = FetchType.EAGER)
72      private Byte[] metadata;
73  
74      @Column(nullable = false)
75      private SAML2BindingType bindingType;
76  
77      @NotNull
78      private Boolean logoutSupported = false;
79  
80      @NotNull
81      private Boolean createUnmatching = false;
82  
83      @NotNull
84      private Boolean selfRegUnmatching = false;
85  
86      @NotNull
87      private Boolean updateMatching = false;
88  
89      @OneToOne(cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.EAGER, mappedBy = "idp")
90      private JPASAML2SP4UIUserTemplate userTemplate;
91  
92      @Lob
93      private String items;
94  
95      @Transient
96      private final List<Item> itemList = new ArrayList<>();
97  
98      @ManyToMany(fetch = FetchType.EAGER)
99      @JoinTable(name = "SAML2IdP4UIAction",
100             joinColumns =
101             @JoinColumn(name = "saml2idp4ui_id"),
102             inverseJoinColumns =
103             @JoinColumn(name = "implementation_id"))
104     private List<JPAImplementation> actions = new ArrayList<>();
105 
106     @OneToOne
107     private JPAImplementation requestedAuthnContextProvider;
108 
109     @Override
110     public String getEntityID() {
111         return entityID;
112     }
113 
114     @Override
115     public void setEntityID(final String entityID) {
116         this.entityID = entityID;
117     }
118 
119     @Override
120     public String getName() {
121         return name;
122     }
123 
124     @Override
125     public void setName(final String name) {
126         this.name = name;
127     }
128 
129     @Override
130     public byte[] getMetadata() {
131         return Optional.ofNullable(metadata).map(ArrayUtils::toPrimitive).orElse(null);
132     }
133 
134     @Override
135     public void setMetadata(final byte[] metadata) {
136         this.metadata = Optional.ofNullable(metadata).map(ArrayUtils::toObject).orElse(null);
137     }
138 
139     @Override
140     public boolean isLogoutSupported() {
141         return logoutSupported;
142     }
143 
144     @Override
145     public void setLogoutSupported(final boolean logoutSupported) {
146         this.logoutSupported = logoutSupported;
147     }
148 
149     @Override
150     public boolean isCreateUnmatching() {
151         return createUnmatching;
152     }
153 
154     @Override
155     public void setCreateUnmatching(final boolean createUnmatching) {
156         this.createUnmatching = createUnmatching;
157     }
158 
159     @Override
160     public boolean isSelfRegUnmatching() {
161         return selfRegUnmatching;
162     }
163 
164     @Override
165     public void setSelfRegUnmatching(final boolean selfRegUnmatching) {
166         this.selfRegUnmatching = selfRegUnmatching;
167     }
168 
169     @Override
170     public boolean isUpdateMatching() {
171         return updateMatching;
172     }
173 
174     @Override
175     public void setUpdateMatching(final boolean updateMatching) {
176         this.updateMatching = updateMatching;
177     }
178 
179     @Override
180     public SAML2BindingType getBindingType() {
181         return bindingType;
182     }
183 
184     @Override
185     public void setBindingType(final SAML2BindingType bindingType) {
186         this.bindingType = bindingType;
187     }
188 
189     @Override
190     public SAML2SP4UIUserTemplate getUserTemplate() {
191         return userTemplate;
192     }
193 
194     @Override
195     public void setUserTemplate(final SAML2SP4UIUserTemplate userTemplate) {
196         checkType(userTemplate, JPASAML2SP4UIUserTemplate.class);
197         this.userTemplate = (JPASAML2SP4UIUserTemplate) userTemplate;
198     }
199 
200     @Override
201     public List<Item> getItems() {
202         return itemList;
203     }
204 
205     @Override
206     public Optional<Item> getConnObjectKeyItem() {
207         return getItems().stream().filter(Item::isConnObjectKey).findFirst();
208     }
209 
210     @Override
211     public void setConnObjectKeyItem(final Item item) {
212         item.setConnObjectKey(true);
213         getItems().add(item);
214     }
215 
216     @Override
217     public boolean add(final Implementation action) {
218         checkType(action, JPAImplementation.class);
219         checkImplementationType(action, SAML2SP4UIImplementationType.IDP_ACTIONS);
220         return actions.contains((JPAImplementation) action) || actions.add((JPAImplementation) action);
221     }
222 
223     @Override
224     public List<? extends Implementation> getActions() {
225         return actions;
226     }
227 
228     @Override
229     public JPAImplementation getRequestedAuthnContextProvider() {
230         return requestedAuthnContextProvider;
231     }
232 
233     @Override
234     public void setRequestedAuthnContextProvider(final Implementation requestedAuthnContextProvider) {
235         checkType(requestedAuthnContextProvider, JPAImplementation.class);
236         checkImplementationType(requestedAuthnContextProvider,
237                 SAML2SP4UIImplementationType.REQUESTED_AUTHN_CONTEXT_PROVIDER);
238         this.requestedAuthnContextProvider = (JPAImplementation) requestedAuthnContextProvider;
239     }
240 
241     protected void json2list(final boolean clearFirst) {
242         if (clearFirst) {
243             getItems().clear();
244         }
245         if (items != null) {
246             getItems().addAll(
247                     POJOHelper.deserialize(items, new TypeReference<List<Item>>() {
248                     }));
249         }
250     }
251 
252     @PostLoad
253     public void postLoad() {
254         json2list(false);
255     }
256 
257     @PostPersist
258     @PostUpdate
259     public void postSave() {
260         json2list(true);
261     }
262 
263     @PrePersist
264     @PreUpdate
265     public void list2json() {
266         items = POJOHelper.serialize(getItems());
267     }
268 }