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.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 }