entity) {
- entity.setPlainAttrsJSON(entity.getPlainAttrList().isEmpty()
+ protected void list2json(final AbstractAttributable entity) {
+ entity.setPlainAttrsJSON(entity.getPlainAttrsList().isEmpty()
? "[]"
- : POJOHelper.serialize(entity.getPlainAttrList()));
+ : POJOHelper.serialize(entity.getPlainAttrsList()));
}
}
diff --git a/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/entity/MaJPAJSONEntityFactory.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/MariaDBEntityFactory.java
similarity index 84%
rename from core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/entity/MaJPAJSONEntityFactory.java
rename to core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/MariaDBEntityFactory.java
index c509826cf3..d0a8ccd82d 100644
--- a/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/entity/MaJPAJSONEntityFactory.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/MariaDBEntityFactory.java
@@ -19,12 +19,12 @@
package org.apache.syncope.core.persistence.jpa.entity;
import org.apache.syncope.core.persistence.api.dao.AnySearchDAO;
-import org.apache.syncope.core.persistence.jpa.dao.MaJPAJSONAnySearchDAO;
+import org.apache.syncope.core.persistence.jpa.dao.MariaDBJPAAnySearchDAO;
-public class MaJPAJSONEntityFactory extends JPAJSONEntityFactory {
+public class MariaDBEntityFactory extends AbstractEntityFactory {
@Override
public Class extends AnySearchDAO> anySearchDAOClass() {
- return MaJPAJSONAnySearchDAO.class;
+ return MariaDBJPAAnySearchDAO.class;
}
}
diff --git a/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/entity/OJPAJSONEntityFactory.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/MySQLEntityFactory.java
similarity index 85%
rename from core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/entity/OJPAJSONEntityFactory.java
rename to core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/MySQLEntityFactory.java
index 0b35c11932..d63807b956 100644
--- a/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/entity/OJPAJSONEntityFactory.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/MySQLEntityFactory.java
@@ -19,12 +19,12 @@
package org.apache.syncope.core.persistence.jpa.entity;
import org.apache.syncope.core.persistence.api.dao.AnySearchDAO;
-import org.apache.syncope.core.persistence.jpa.dao.OJPAJSONAnySearchDAO;
+import org.apache.syncope.core.persistence.jpa.dao.MySQLJPAAnySearchDAO;
-public class OJPAJSONEntityFactory extends JPAJSONEntityFactory {
+public class MySQLEntityFactory extends AbstractEntityFactory {
@Override
public Class extends AnySearchDAO> anySearchDAOClass() {
- return OJPAJSONAnySearchDAO.class;
+ return MySQLJPAAnySearchDAO.class;
}
}
diff --git a/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/entity/MyJPAJSONEntityFactory.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/OracleEntityFactory.java
similarity index 85%
rename from core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/entity/MyJPAJSONEntityFactory.java
rename to core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/OracleEntityFactory.java
index 3429d477d6..49856e923c 100644
--- a/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/entity/MyJPAJSONEntityFactory.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/OracleEntityFactory.java
@@ -19,12 +19,12 @@
package org.apache.syncope.core.persistence.jpa.entity;
import org.apache.syncope.core.persistence.api.dao.AnySearchDAO;
-import org.apache.syncope.core.persistence.jpa.dao.MyJPAJSONAnySearchDAO;
+import org.apache.syncope.core.persistence.jpa.dao.OracleJPAAnySearchDAO;
-public class MyJPAJSONEntityFactory extends JPAJSONEntityFactory {
+public class OracleEntityFactory extends AbstractEntityFactory {
@Override
public Class extends AnySearchDAO> anySearchDAOClass() {
- return MyJPAJSONAnySearchDAO.class;
+ return OracleJPAAnySearchDAO.class;
}
}
diff --git a/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/entity/PGJPAJSONEntityFactory.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/PGEntityFactory.java
similarity index 84%
rename from core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/entity/PGJPAJSONEntityFactory.java
rename to core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/PGEntityFactory.java
index 9da2e9eb19..917d581568 100644
--- a/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/entity/PGJPAJSONEntityFactory.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/PGEntityFactory.java
@@ -19,12 +19,12 @@
package org.apache.syncope.core.persistence.jpa.entity;
import org.apache.syncope.core.persistence.api.dao.AnySearchDAO;
-import org.apache.syncope.core.persistence.jpa.dao.PGJPAJSONAnySearchDAO;
+import org.apache.syncope.core.persistence.jpa.dao.PGJPAAnySearchDAO;
-public class PGJPAJSONEntityFactory extends JPAJSONEntityFactory {
+public class PGEntityFactory extends AbstractEntityFactory {
@Override
public Class extends AnySearchDAO> anySearchDAOClass() {
- return PGJPAJSONAnySearchDAO.class;
+ return PGJPAAnySearchDAO.class;
}
}
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/anyobject/JPAADynGroupMembership.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/anyobject/JPAADynGroupMembership.java
index 18d30d28c2..83857fcf3e 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/anyobject/JPAADynGroupMembership.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/anyobject/JPAADynGroupMembership.java
@@ -20,6 +20,7 @@
import jakarta.persistence.Entity;
import jakarta.persistence.ManyToOne;
+import jakarta.persistence.OneToOne;
import jakarta.persistence.Table;
import org.apache.syncope.core.persistence.api.entity.AnyType;
import org.apache.syncope.core.persistence.api.entity.anyobject.ADynGroupMembership;
@@ -37,7 +38,8 @@ public class JPAADynGroupMembership extends AbstractDynMembership imp
public static final String TABLE = "ADynGroupMembership";
- private Group group;
+ @OneToOne
+ private JPAGroup group;
@ManyToOne
private JPAAnyType anyType;
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/anyobject/JPAAMembership.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/anyobject/JPAAMembership.java
index 1caaf7022e..2f9c15e9c8 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/anyobject/JPAAMembership.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/anyobject/JPAAMembership.java
@@ -18,7 +18,9 @@
*/
package org.apache.syncope.core.persistence.jpa.entity.anyobject;
+import jakarta.persistence.Column;
import jakarta.persistence.Entity;
+import jakarta.persistence.ManyToOne;
import jakarta.persistence.Table;
import org.apache.syncope.core.persistence.api.entity.MembershipType;
import org.apache.syncope.core.persistence.api.entity.RelationshipType;
@@ -36,9 +38,13 @@ public class JPAAMembership extends AbstractGeneratedKeyEntity implements AMembe
public static final String TABLE = "AMembership";
- private AnyObject leftEnd;
+ @ManyToOne
+ @Column(name = "anyObject_id")
+ private JPAAnyObject leftEnd;
- private Group rightEnd;
+ @ManyToOne
+ @Column(name = "group_id")
+ private JPAGroup rightEnd;
@Override
public MembershipType getType() {
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/anyobject/JPAAPlainAttr.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/anyobject/JPAAPlainAttr.java
deleted file mode 100644
index 1e55ee4dfa..0000000000
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/anyobject/JPAAPlainAttr.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.syncope.core.persistence.jpa.entity.anyobject;
-
-import jakarta.persistence.CascadeType;
-import jakarta.persistence.Entity;
-import jakarta.persistence.FetchType;
-import jakarta.persistence.ManyToOne;
-import jakarta.persistence.OneToMany;
-import jakarta.persistence.OneToOne;
-import jakarta.persistence.Table;
-import jakarta.validation.Valid;
-import java.util.ArrayList;
-import java.util.List;
-import org.apache.syncope.core.persistence.api.entity.PlainAttrUniqueValue;
-import org.apache.syncope.core.persistence.api.entity.PlainAttrValue;
-import org.apache.syncope.core.persistence.api.entity.anyobject.AMembership;
-import org.apache.syncope.core.persistence.api.entity.anyobject.APlainAttr;
-import org.apache.syncope.core.persistence.api.entity.anyobject.APlainAttrUniqueValue;
-import org.apache.syncope.core.persistence.api.entity.anyobject.APlainAttrValue;
-import org.apache.syncope.core.persistence.api.entity.anyobject.AnyObject;
-import org.apache.syncope.core.persistence.jpa.entity.AbstractPlainAttr;
-
-@Entity
-@Table(name = JPAAPlainAttr.TABLE)
-public class JPAAPlainAttr extends AbstractPlainAttr implements APlainAttr {
-
- private static final long serialVersionUID = 8066058729580952116L;
-
- public static final String TABLE = "APlainAttr";
-
- @ManyToOne(fetch = FetchType.EAGER)
- private JPAAnyObject owner;
-
- /**
- * The membership of this attribute; might be {@code NULL} if this attribute is not related to a membership.
- */
- @ManyToOne(fetch = FetchType.EAGER)
- private JPAAMembership membership;
-
- @OneToMany(cascade = { CascadeType.PERSIST, CascadeType.MERGE }, orphanRemoval = true, mappedBy = "attribute")
- @Valid
- private List values = new ArrayList<>();
-
- @OneToOne(cascade = CascadeType.ALL, orphanRemoval = true, mappedBy = "attribute")
- @Valid
- private JPAAPlainAttrUniqueValue uniqueValue;
-
- @Override
- public AnyObject getOwner() {
- return owner;
- }
-
- @Override
- public void setOwner(final AnyObject owner) {
- checkType(owner, JPAAnyObject.class);
- this.owner = (JPAAnyObject) owner;
- }
-
- @Override
- public AMembership getMembership() {
- return membership;
- }
-
- @Override
- public void setMembership(final AMembership membership) {
- checkType(membership, JPAAMembership.class);
- this.membership = (JPAAMembership) membership;
- }
-
- @Override
- protected boolean addForMultiValue(final PlainAttrValue attrValue) {
- checkType(attrValue, JPAAPlainAttrValue.class);
- return values.add((JPAAPlainAttrValue) attrValue);
- }
-
- @Override
- public List extends APlainAttrValue> getValues() {
- return values;
- }
-
- @Override
- public APlainAttrUniqueValue getUniqueValue() {
- return uniqueValue;
- }
-
- @Override
- public void setUniqueValue(final PlainAttrUniqueValue uniqueValue) {
- checkType(uniqueValue, JPAAPlainAttrUniqueValue.class);
- this.uniqueValue = (JPAAPlainAttrUniqueValue) uniqueValue;
- }
-}
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/anyobject/JPAAPlainAttrUniqueValue.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/anyobject/JPAAPlainAttrUniqueValue.java
deleted file mode 100644
index 4ab111890c..0000000000
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/anyobject/JPAAPlainAttrUniqueValue.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.syncope.core.persistence.jpa.entity.anyobject;
-
-import jakarta.persistence.Entity;
-import jakarta.persistence.JoinColumn;
-import jakarta.persistence.ManyToOne;
-import jakarta.persistence.OneToOne;
-import jakarta.persistence.Table;
-import org.apache.syncope.core.persistence.api.entity.PlainAttr;
-import org.apache.syncope.core.persistence.api.entity.PlainSchema;
-import org.apache.syncope.core.persistence.api.entity.anyobject.APlainAttr;
-import org.apache.syncope.core.persistence.api.entity.anyobject.APlainAttrUniqueValue;
-import org.apache.syncope.core.persistence.jpa.entity.AbstractPlainAttrValue;
-import org.apache.syncope.core.persistence.jpa.entity.JPAPlainSchema;
-
-@Entity
-@Table(name = JPAAPlainAttrUniqueValue.TABLE)
-public class JPAAPlainAttrUniqueValue extends AbstractPlainAttrValue implements APlainAttrUniqueValue {
-
- private static final long serialVersionUID = -6412206895091662679L;
-
- public static final String TABLE = "APlainAttrUniqueValue";
-
- @OneToOne(optional = false)
- private JPAAPlainAttr attribute;
-
- @ManyToOne(optional = false)
- @JoinColumn(name = "schema_id")
- private JPAPlainSchema schema;
-
- @Override
- public APlainAttr getAttr() {
- return attribute;
- }
-
- @Override
- public void setAttr(final PlainAttr> attr) {
- checkType(attr, JPAAPlainAttr.class);
- this.attribute = (JPAAPlainAttr) attr;
- }
-
- @Override
- public PlainSchema getSchema() {
- return schema;
- }
-
- @Override
- public void setSchema(final PlainSchema schema) {
- checkType(schema, JPAPlainSchema.class);
- this.schema = (JPAPlainSchema) schema;
- }
-}
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/anyobject/JPAAPlainAttrValue.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/anyobject/JPAAPlainAttrValue.java
deleted file mode 100644
index 6f97945695..0000000000
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/anyobject/JPAAPlainAttrValue.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.syncope.core.persistence.jpa.entity.anyobject;
-
-import jakarta.persistence.Entity;
-import jakarta.persistence.ManyToOne;
-import jakarta.persistence.Table;
-import jakarta.validation.constraints.NotNull;
-import org.apache.syncope.core.persistence.api.entity.PlainAttr;
-import org.apache.syncope.core.persistence.api.entity.anyobject.APlainAttr;
-import org.apache.syncope.core.persistence.api.entity.anyobject.APlainAttrValue;
-import org.apache.syncope.core.persistence.jpa.entity.AbstractPlainAttrValue;
-
-@Entity
-@Table(name = JPAAPlainAttrValue.TABLE)
-public class JPAAPlainAttrValue extends AbstractPlainAttrValue implements APlainAttrValue {
-
- private static final long serialVersionUID = -2965487882824889272L;
-
- public static final String TABLE = "APlainAttrValue";
-
- @ManyToOne
- @NotNull
- private JPAAPlainAttr attribute;
-
- @Override
- public APlainAttr getAttr() {
- return attribute;
- }
-
- @Override
- public void setAttr(final PlainAttr> attr) {
- checkType(attr, JPAAPlainAttr.class);
- this.attribute = (JPAAPlainAttr) attr;
- }
-}
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/anyobject/JPAARelationship.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/anyobject/JPAARelationship.java
index e0dbf1bd41..ca4baa6a69 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/anyobject/JPAARelationship.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/anyobject/JPAARelationship.java
@@ -18,6 +18,7 @@
*/
package org.apache.syncope.core.persistence.jpa.entity.anyobject;
+import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.FetchType;
import jakarta.persistence.ManyToOne;
@@ -42,9 +43,13 @@ public class JPAARelationship extends AbstractGeneratedKeyEntity implements ARel
@ManyToOne(fetch = FetchType.EAGER, optional = false)
private JPARelationshipType type;
- private AnyObject leftEnd;
+ @ManyToOne
+ @Column(name = "left_anyObject_id")
+ private JPAAnyObject leftEnd;
- private AnyObject rightEnd;
+ @ManyToOne
+ @Column(name = "right_anyObject_id")
+ private JPAAnyObject rightEnd;
@Override
public RelationshipType getType() {
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/anyobject/JPAAnyObject.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/anyobject/JPAAnyObject.java
index f3ed177cd3..2f187611c1 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/anyobject/JPAAnyObject.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/anyobject/JPAAnyObject.java
@@ -21,6 +21,7 @@
import jakarta.persistence.Cacheable;
import jakarta.persistence.CascadeType;
import jakarta.persistence.Entity;
+import jakarta.persistence.EntityListeners;
import jakarta.persistence.FetchType;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.JoinTable;
@@ -28,11 +29,13 @@
import jakarta.persistence.ManyToOne;
import jakarta.persistence.OneToMany;
import jakarta.persistence.Table;
+import jakarta.persistence.Transient;
import jakarta.persistence.UniqueConstraint;
import jakarta.validation.Valid;
import jakarta.validation.constraints.Size;
import java.util.ArrayList;
import java.util.List;
+import java.util.Objects;
import java.util.Optional;
import org.apache.syncope.core.persistence.api.entity.AnyType;
import org.apache.syncope.core.persistence.api.entity.AnyTypeClass;
@@ -51,6 +54,7 @@
@Entity
@Table(name = JPAAnyObject.TABLE, uniqueConstraints =
@UniqueConstraint(columnNames = { "name", "type_id" }))
+@EntityListeners({ JSONAnyObjectListener.class })
@Cacheable
@AnyObjectCheck
public class JPAAnyObject
@@ -67,9 +71,10 @@ public class JPAAnyObject
@ManyToOne(fetch = FetchType.EAGER, optional = false)
private JPAAnyType type;
- @OneToMany(cascade = CascadeType.ALL, mappedBy = "owner")
- @Valid
- private List plainAttrs = new ArrayList<>();
+ private String plainAttrs;
+
+ @Transient
+ private final List plainAttrsList = new ArrayList<>();
@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(joinColumns =
@@ -130,16 +135,33 @@ public List extends ExternalResource> getResources() {
}
@Override
- public boolean add(final APlainAttr attr) {
- checkType(attr, JPAAPlainAttr.class);
- return plainAttrs.add((JPAAPlainAttr) attr);
+ public List extends APlainAttr> getPlainAttrsList() {
+ return plainAttrsList;
}
@Override
- protected List extends APlainAttr> internalGetPlainAttrs() {
+ public String getPlainAttrsJSON() {
return plainAttrs;
}
+ @Override
+ public void setPlainAttrsJSON(final String plainAttrs) {
+ this.plainAttrs = plainAttrs;
+ }
+
+ @Override
+ public boolean add(final APlainAttr attr) {
+ checkType(attr, JSONAPlainAttr.class);
+ return plainAttrsList.add((JSONAPlainAttr) attr);
+ }
+
+ @Override
+ public boolean remove(final APlainAttr attr) {
+ checkType(attr, JSONAPlainAttr.class);
+ return plainAttrsList.removeIf(jsonAttr -> jsonAttr.getSchemaKey().equals(attr.getSchema().getKey())
+ && Objects.equals(jsonAttr.getMembershipKey(), attr.getMembershipKey()));
+ }
+
@Override
public boolean add(final AnyTypeClass auxClass) {
checkType(auxClass, JPAAnyTypeClass.class);
@@ -181,6 +203,8 @@ public boolean add(final AMembership membership) {
@Override
public boolean remove(final AMembership membership) {
checkType(membership, JPAAMembership.class);
+ plainAttrsList.removeIf(attr -> attr.getMembershipKey() != null
+ && attr.getMembershipKey().equals(membership.getKey()));
return this.memberships.remove((JPAAMembership) membership);
}
diff --git a/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/entity/anyobject/JPAJSONAPlainAttr.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/anyobject/JSONAPlainAttr.java
similarity index 59%
rename from core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/entity/anyobject/JPAJSONAPlainAttr.java
rename to core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/anyobject/JSONAPlainAttr.java
index 356af7a2d8..be42f7e393 100644
--- a/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/entity/anyobject/JPAJSONAPlainAttr.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/anyobject/JSONAPlainAttr.java
@@ -18,9 +18,8 @@
*/
package org.apache.syncope.core.persistence.jpa.entity.anyobject;
+import com.fasterxml.jackson.annotation.JsonGetter;
import com.fasterxml.jackson.annotation.JsonIgnore;
-import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
-import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonSetter;
import java.util.ArrayList;
@@ -29,33 +28,21 @@
import org.apache.commons.lang3.builder.EqualsBuilder;
import org.apache.commons.lang3.builder.HashCodeBuilder;
import org.apache.syncope.core.persistence.api.dao.AnyObjectDAO;
-import org.apache.syncope.core.persistence.api.dao.PlainSchemaDAO;
-import org.apache.syncope.core.persistence.api.entity.JSONPlainAttr;
import org.apache.syncope.core.persistence.api.entity.PlainAttrUniqueValue;
import org.apache.syncope.core.persistence.api.entity.PlainAttrValue;
-import org.apache.syncope.core.persistence.api.entity.PlainSchema;
import org.apache.syncope.core.persistence.api.entity.anyobject.AMembership;
import org.apache.syncope.core.persistence.api.entity.anyobject.APlainAttr;
import org.apache.syncope.core.persistence.api.entity.anyobject.APlainAttrValue;
import org.apache.syncope.core.persistence.api.entity.anyobject.AnyObject;
import org.apache.syncope.core.persistence.jpa.entity.AbstractPlainAttr;
-import org.apache.syncope.core.persistence.jpa.entity.JPAPlainSchema;
import org.apache.syncope.core.spring.ApplicationContextProvider;
-@JsonIgnoreProperties("valuesAsStrings")
-@JsonInclude(JsonInclude.Include.NON_EMPTY)
-public class JPAJSONAPlainAttr extends AbstractPlainAttr implements APlainAttr, JSONPlainAttr {
+public class JSONAPlainAttr extends AbstractPlainAttr implements APlainAttr {
- private static final long serialVersionUID = 806271775349587902L;
+ private static final long serialVersionUID = 8066058729580952116L;
- /**
- * The owner of this attribute.
- */
@JsonIgnore
- private JPAJSONAnyObject owner;
-
- @JsonProperty
- private String schema;
+ private JPAAnyObject owner;
/**
* The membership of this attribute; might be {@code NULL} if this attribute is not related to a membership.
@@ -63,16 +50,10 @@ public class JPAJSONAPlainAttr extends AbstractPlainAttr implements A
@JsonProperty
private String membership;
- /**
- * Values of this attribute (if schema is not UNIQUE).
- */
- private final List values = new ArrayList<>();
+ private List values = new ArrayList<>();
- /**
- * Value of this attribute (if schema is UNIQUE).
- */
@JsonProperty
- private JPAJSONAPlainAttrUniqueValue uniqueValue;
+ private JSONAPlainAttrUniqueValue uniqueValue;
@Override
public AnyObject getOwner() {
@@ -81,55 +62,26 @@ public AnyObject getOwner() {
@Override
public void setOwner(final AnyObject owner) {
- checkType(owner, JPAJSONAnyObject.class);
- this.owner = (JPAJSONAnyObject) owner;
+ this.owner = (JPAAnyObject) owner;
}
@JsonIgnore
@Override
- public String getSchemaKey() {
- return schema;
+ public AMembership getMembership() {
+ return ApplicationContextProvider.getBeanFactory().getBean(AnyObjectDAO.class).findMembership(membership);
}
- @JsonIgnore
@Override
- public JPAPlainSchema getSchema() {
- return Optional.ofNullable(schema).
- flatMap(s -> ApplicationContextProvider.getBeanFactory().getBean(PlainSchemaDAO.class).findById(s)).
- map(JPAPlainSchema.class::cast).
- orElse(null);
+ public void setMembership(final AMembership membership) {
+ this.membership = Optional.ofNullable(membership).map(AMembership::getKey).orElse(null);
}
+ @JsonGetter("membership")
@Override
- public void setSchema(final PlainSchema schema) {
- if (schema != null) {
- this.schema = schema.getKey();
- }
- }
-
- @JsonSetter("schema")
- public void setSchema(final String schema) {
- this.schema = schema;
- }
-
- @JsonIgnore
public String getMembershipKey() {
return membership;
}
- @JsonIgnore
- @Override
- public AMembership getMembership() {
- return ApplicationContextProvider.getBeanFactory().getBean(AnyObjectDAO.class).findMembership(membership);
- }
-
- @Override
- public void setMembership(final AMembership membership) {
- if (membership != null) {
- this.membership = membership.getKey();
- }
- }
-
@JsonSetter("membership")
public void setMembership(final String membership) {
this.membership = membership;
@@ -137,13 +89,7 @@ public void setMembership(final String membership) {
@Override
protected boolean addForMultiValue(final PlainAttrValue attrValue) {
- checkType(attrValue, JPAJSONAPlainAttrValue.class);
- return values.add((JPAJSONAPlainAttrValue) attrValue);
- }
-
- @Override
- public boolean add(final PlainAttrValue value) {
- return addForMultiValue(value);
+ return values.add((JSONAPlainAttrValue) attrValue);
}
@Override
@@ -151,27 +97,21 @@ public List extends APlainAttrValue> getValues() {
return values;
}
- @JsonIgnore
- public List getPGValues() {
- return values;
- }
-
@Override
- public JPAJSONAPlainAttrUniqueValue getUniqueValue() {
+ public JSONAPlainAttrUniqueValue getUniqueValue() {
return uniqueValue;
}
@JsonIgnore
@Override
public void setUniqueValue(final PlainAttrUniqueValue uniqueValue) {
- checkType(uniqueValue, JPAJSONAPlainAttrUniqueValue.class);
- this.uniqueValue = (JPAJSONAPlainAttrUniqueValue) uniqueValue;
+ this.uniqueValue = (JSONAPlainAttrUniqueValue) uniqueValue;
}
@Override
public int hashCode() {
return new HashCodeBuilder().
- append(schema).
+ appendSuper(super.hashCode()).
append(membership).
append(values).
append(uniqueValue).
@@ -189,9 +129,9 @@ public boolean equals(final Object obj) {
if (getClass() != obj.getClass()) {
return false;
}
- final JPAJSONAPlainAttr other = (JPAJSONAPlainAttr) obj;
+ final JSONAPlainAttr other = (JSONAPlainAttr) obj;
return new EqualsBuilder().
- append(schema, other.schema).
+ appendSuper(super.equals(obj)).
append(membership, other.membership).
append(values, other.values).
append(uniqueValue, other.uniqueValue).
diff --git a/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/entity/anyobject/JPAJSONAPlainAttrUniqueValue.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/anyobject/JSONAPlainAttrUniqueValue.java
similarity index 76%
rename from core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/entity/anyobject/JPAJSONAPlainAttrUniqueValue.java
rename to core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/anyobject/JSONAPlainAttrUniqueValue.java
index cd8247eef2..e67cf26948 100644
--- a/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/entity/anyobject/JPAJSONAPlainAttrUniqueValue.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/anyobject/JSONAPlainAttrUniqueValue.java
@@ -19,22 +19,18 @@
package org.apache.syncope.core.persistence.jpa.entity.anyobject;
import com.fasterxml.jackson.annotation.JsonIgnore;
-import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
-import com.fasterxml.jackson.annotation.JsonInclude;
import org.apache.syncope.core.persistence.api.entity.PlainAttr;
import org.apache.syncope.core.persistence.api.entity.PlainSchema;
import org.apache.syncope.core.persistence.api.entity.anyobject.APlainAttr;
import org.apache.syncope.core.persistence.api.entity.anyobject.APlainAttrUniqueValue;
import org.apache.syncope.core.persistence.jpa.entity.AbstractPlainAttrValue;
-@JsonIgnoreProperties({ "valueAsString", "value" })
-@JsonInclude(JsonInclude.Include.NON_NULL)
-public class JPAJSONAPlainAttrUniqueValue extends AbstractPlainAttrValue implements APlainAttrUniqueValue {
+public class JSONAPlainAttrUniqueValue extends AbstractPlainAttrValue implements APlainAttrUniqueValue {
- private static final long serialVersionUID = -4053996864791245312L;
+ private static final long serialVersionUID = 4681561795607192855L;
@JsonIgnore
- private JPAJSONAPlainAttr attr;
+ private JSONAPlainAttr attr;
@Override
public APlainAttr getAttr() {
@@ -43,8 +39,7 @@ public APlainAttr getAttr() {
@Override
public void setAttr(final PlainAttr> attr) {
- checkType(attr, JPAJSONAPlainAttr.class);
- this.attr = (JPAJSONAPlainAttr) attr;
+ this.attr = (JSONAPlainAttr) attr;
}
@JsonIgnore
diff --git a/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/entity/anyobject/JPAJSONAPlainAttrValue.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/anyobject/JSONAPlainAttrValue.java
similarity index 73%
rename from core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/entity/anyobject/JPAJSONAPlainAttrValue.java
rename to core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/anyobject/JSONAPlainAttrValue.java
index d4815d305c..bdb458064c 100644
--- a/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/entity/anyobject/JPAJSONAPlainAttrValue.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/anyobject/JSONAPlainAttrValue.java
@@ -19,21 +19,19 @@
package org.apache.syncope.core.persistence.jpa.entity.anyobject;
import com.fasterxml.jackson.annotation.JsonIgnore;
-import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
-import com.fasterxml.jackson.annotation.JsonInclude;
+import jakarta.validation.constraints.NotNull;
import org.apache.syncope.core.persistence.api.entity.PlainAttr;
import org.apache.syncope.core.persistence.api.entity.anyobject.APlainAttr;
import org.apache.syncope.core.persistence.api.entity.anyobject.APlainAttrValue;
import org.apache.syncope.core.persistence.jpa.entity.AbstractPlainAttrValue;
-@JsonIgnoreProperties({ "valueAsString", "value" })
-@JsonInclude(JsonInclude.Include.NON_NULL)
-public class JPAJSONAPlainAttrValue extends AbstractPlainAttrValue implements APlainAttrValue {
+public class JSONAPlainAttrValue extends AbstractPlainAttrValue implements APlainAttrValue {
- private static final long serialVersionUID = 1832825176101443555L;
+ private static final long serialVersionUID = -766808291128424707L;
@JsonIgnore
- private JPAJSONAPlainAttr attr;
+ @NotNull
+ private JSONAPlainAttr attr;
@Override
public APlainAttr getAttr() {
@@ -42,7 +40,6 @@ public APlainAttr getAttr() {
@Override
public void setAttr(final PlainAttr> attr) {
- checkType(attr, JPAJSONAPlainAttr.class);
- this.attr = (JPAJSONAPlainAttr) attr;
+ this.attr = (JSONAPlainAttr) attr;
}
}
diff --git a/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/entity/anyobject/JPAJSONAnyObjectListener.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/anyobject/JSONAnyObjectListener.java
similarity index 71%
rename from core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/entity/anyobject/JPAJSONAnyObjectListener.java
rename to core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/anyobject/JSONAnyObjectListener.java
index c66f43dc5e..5f46a9effa 100644
--- a/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/entity/anyobject/JPAJSONAnyObjectListener.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/anyobject/JSONAnyObjectListener.java
@@ -25,36 +25,36 @@
import jakarta.persistence.PrePersist;
import jakarta.persistence.PreUpdate;
import java.util.List;
-import org.apache.syncope.core.persistence.api.entity.JSONPlainAttr;
+import org.apache.syncope.core.persistence.api.entity.anyobject.APlainAttr;
import org.apache.syncope.core.persistence.api.entity.anyobject.AnyObject;
-import org.apache.syncope.core.persistence.jpa.entity.JPAJSONEntityListener;
+import org.apache.syncope.core.persistence.jpa.entity.JSONEntityListener;
import org.apache.syncope.core.provisioning.api.serialization.POJOHelper;
-public class JPAJSONAnyObjectListener extends JPAJSONEntityListener {
+public class JSONAnyObjectListener extends JSONEntityListener {
- protected static final TypeReference> TYPEREF =
- new TypeReference>() {
+ protected static final TypeReference> TYPEREF =
+ new TypeReference>() {
};
@Override
- protected List extends JSONPlainAttr> getAttrs(final String plainAttrsJSON) {
+ protected List extends APlainAttr> getAttrs(final String plainAttrsJSON) {
return POJOHelper.deserialize(plainAttrsJSON, TYPEREF);
}
@PostLoad
- public void read(final JPAJSONAnyObject anyObject) {
+ public void read(final JPAAnyObject anyObject) {
super.json2list(anyObject, false);
}
@PrePersist
@PreUpdate
- public void save(final JPAJSONAnyObject anyObject) {
+ public void save(final JPAAnyObject anyObject) {
super.list2json(anyObject);
}
@PostPersist
@PostUpdate
- public void readAfterSave(final JPAJSONAnyObject anyObject) {
+ public void readAfterSave(final JPAAnyObject anyObject) {
super.json2list(anyObject, true);
}
}
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/group/JPAGPlainAttrUniqueValue.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/group/JPAGPlainAttrUniqueValue.java
deleted file mode 100644
index a0087dffcc..0000000000
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/group/JPAGPlainAttrUniqueValue.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.syncope.core.persistence.jpa.entity.group;
-
-import jakarta.persistence.Entity;
-import jakarta.persistence.JoinColumn;
-import jakarta.persistence.ManyToOne;
-import jakarta.persistence.OneToOne;
-import jakarta.persistence.Table;
-import org.apache.syncope.core.persistence.api.entity.PlainAttr;
-import org.apache.syncope.core.persistence.api.entity.PlainSchema;
-import org.apache.syncope.core.persistence.api.entity.group.GPlainAttr;
-import org.apache.syncope.core.persistence.api.entity.group.GPlainAttrUniqueValue;
-import org.apache.syncope.core.persistence.jpa.entity.AbstractPlainAttrValue;
-import org.apache.syncope.core.persistence.jpa.entity.JPAPlainSchema;
-
-@Entity
-@Table(name = JPAGPlainAttrUniqueValue.TABLE)
-public class JPAGPlainAttrUniqueValue extends AbstractPlainAttrValue implements GPlainAttrUniqueValue {
-
- private static final long serialVersionUID = 4681561795607192855L;
-
- public static final String TABLE = "GPlainAttrUniqueValue";
-
- @OneToOne(optional = false)
- private JPAGPlainAttr attribute;
-
- @ManyToOne(optional = false)
- @JoinColumn(name = "schema_id")
- private JPAPlainSchema schema;
-
- @Override
- public GPlainAttr getAttr() {
- return attribute;
- }
-
- @Override
- public void setAttr(final PlainAttr> attr) {
- checkType(attr, JPAGPlainAttr.class);
- this.attribute = (JPAGPlainAttr) attr;
- }
-
- @Override
- public PlainSchema getSchema() {
- return schema;
- }
-
- @Override
- public void setSchema(final PlainSchema schema) {
- checkType(schema, JPAPlainSchema.class);
- this.schema = (JPAPlainSchema) schema;
- }
-}
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/group/JPAGPlainAttrValue.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/group/JPAGPlainAttrValue.java
deleted file mode 100644
index 52bc20d6ac..0000000000
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/group/JPAGPlainAttrValue.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.syncope.core.persistence.jpa.entity.group;
-
-import jakarta.persistence.Entity;
-import jakarta.persistence.ManyToOne;
-import jakarta.persistence.Table;
-import jakarta.validation.constraints.NotNull;
-import org.apache.syncope.core.persistence.api.entity.PlainAttr;
-import org.apache.syncope.core.persistence.api.entity.group.GPlainAttr;
-import org.apache.syncope.core.persistence.api.entity.group.GPlainAttrValue;
-import org.apache.syncope.core.persistence.jpa.entity.AbstractPlainAttrValue;
-
-@Entity
-@Table(name = JPAGPlainAttrValue.TABLE)
-public class JPAGPlainAttrValue extends AbstractPlainAttrValue implements GPlainAttrValue {
-
- private static final long serialVersionUID = -766808291128424707L;
-
- public static final String TABLE = "GPlainAttrValue";
-
- @ManyToOne
- @NotNull
- private JPAGPlainAttr attribute;
-
- @Override
- public GPlainAttr getAttr() {
- return attribute;
- }
-
- @Override
- public void setAttr(final PlainAttr> attr) {
- checkType(attr, JPAGPlainAttr.class);
- this.attribute = (JPAGPlainAttr) attr;
- }
-}
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/group/JPAGroup.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/group/JPAGroup.java
index 5541dd4c12..76a2b79f7e 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/group/JPAGroup.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/group/JPAGroup.java
@@ -22,13 +22,16 @@
import jakarta.persistence.CascadeType;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
+import jakarta.persistence.EntityListeners;
import jakarta.persistence.FetchType;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.JoinTable;
import jakarta.persistence.ManyToMany;
+import jakarta.persistence.ManyToOne;
import jakarta.persistence.OneToMany;
import jakarta.persistence.OneToOne;
import jakarta.persistence.Table;
+import jakarta.persistence.Transient;
import jakarta.persistence.UniqueConstraint;
import jakarta.validation.Valid;
import jakarta.validation.constraints.NotNull;
@@ -56,6 +59,7 @@
@Entity
@Table(name = JPAGroup.TABLE)
+@EntityListeners({ JSONGroupListener.class })
@Cacheable
@GroupCheck
public class JPAGroup extends AbstractAny implements Group {
@@ -68,13 +72,16 @@ public class JPAGroup extends AbstractAny implements Group {
@NotNull
private String name;
- protected User userOwner;
+ @ManyToOne
+ private JPAUser userOwner;
- protected Group groupOwner;
+ @ManyToOne
+ private JPAGroup groupOwner;
- @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, mappedBy = "owner")
- @Valid
- private List plainAttrs = new ArrayList<>();
+ private String plainAttrs;
+
+ @Transient
+ private final List plainAttrsList = new ArrayList<>();
@ManyToMany(fetch = FetchType.LAZY)
@JoinTable(joinColumns =
@@ -157,28 +164,43 @@ public void setGroupOwner(final Group group) {
this.groupOwner = (JPAGroup) group;
}
+ @Override
+ public List extends GPlainAttr> getPlainAttrsList() {
+ return plainAttrsList;
+ }
+
+ @Override
+ public String getPlainAttrsJSON() {
+ return plainAttrs;
+ }
+
+ @Override
+ public void setPlainAttrsJSON(final String plainAttrs) {
+ this.plainAttrs = plainAttrs;
+ }
+
@Override
public boolean add(final GPlainAttr attr) {
- checkType(attr, JPAGPlainAttr.class);
- return plainAttrs.add((JPAGPlainAttr) attr);
+ checkType(attr, JSONGPlainAttr.class);
+ return plainAttrsList.add((JSONGPlainAttr) attr);
}
@Override
public boolean remove(final GPlainAttr attr) {
- checkType(attr, JPAGPlainAttr.class);
- return getPlainAttrs().remove((JPAGPlainAttr) attr);
+ checkType(attr, JSONGPlainAttr.class);
+ return plainAttrsList.removeIf(a -> a.getSchemaKey().equals(attr.getSchema().getKey()));
}
@Override
public Optional extends GPlainAttr> getPlainAttr(final String plainSchema) {
- return getPlainAttrs().stream().
- filter(plainAttr -> plainAttr != null && plainAttr.getSchema() != null
- && plainSchema.equals(plainAttr.getSchema().getKey())).findFirst();
+ return plainAttrsList.stream().
+ filter(attr -> plainSchema.equals(attr.getSchemaKey())).
+ findFirst();
}
@Override
public List extends GPlainAttr> getPlainAttrs() {
- return plainAttrs;
+ return plainAttrsList.stream().toList();
}
@Override
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/group/JPATypeExtension.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/group/JPATypeExtension.java
index ffce5f8a2f..fbdc2da7d2 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/group/JPATypeExtension.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/group/JPATypeExtension.java
@@ -45,7 +45,8 @@ public class JPATypeExtension extends AbstractGeneratedKeyEntity implements Type
public static final String TABLE = "TypeExtension";
- private Group group;
+ @ManyToOne
+ private JPAGroup group;
@ManyToOne
private JPAAnyType anyType;
@@ -55,7 +56,8 @@ public class JPATypeExtension extends AbstractGeneratedKeyEntity implements Type
@JoinColumn(name = "typeExtension_id"),
inverseJoinColumns =
@JoinColumn(name = "anyTypeClass_id"),
- uniqueConstraints = @UniqueConstraint(columnNames = { "typeExtension_id", "anyTypeClass_id" }))
+ uniqueConstraints =
+ @UniqueConstraint(columnNames = { "typeExtension_id", "anyTypeClass_id" }))
private List auxClasses = new ArrayList<>();
@Override
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/group/JPAGPlainAttr.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/group/JSONGPlainAttr.java
similarity index 55%
rename from core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/group/JPAGPlainAttr.java
rename to core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/group/JSONGPlainAttr.java
index 1b3c7aeb76..bf29de77a9 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/group/JPAGPlainAttr.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/group/JSONGPlainAttr.java
@@ -18,42 +18,36 @@
*/
package org.apache.syncope.core.persistence.jpa.entity.group;
-import jakarta.persistence.CascadeType;
-import jakarta.persistence.Entity;
-import jakarta.persistence.FetchType;
-import jakarta.persistence.ManyToOne;
-import jakarta.persistence.OneToMany;
-import jakarta.persistence.OneToOne;
-import jakarta.persistence.Table;
-import jakarta.validation.Valid;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonProperty;
import java.util.ArrayList;
import java.util.List;
+import org.apache.commons.lang3.builder.EqualsBuilder;
+import org.apache.commons.lang3.builder.HashCodeBuilder;
import org.apache.syncope.core.persistence.api.entity.PlainAttrUniqueValue;
import org.apache.syncope.core.persistence.api.entity.PlainAttrValue;
import org.apache.syncope.core.persistence.api.entity.group.GPlainAttr;
-import org.apache.syncope.core.persistence.api.entity.group.GPlainAttrUniqueValue;
import org.apache.syncope.core.persistence.api.entity.group.GPlainAttrValue;
import org.apache.syncope.core.persistence.api.entity.group.Group;
import org.apache.syncope.core.persistence.jpa.entity.AbstractPlainAttr;
-@Entity
-@Table(name = JPAGPlainAttr.TABLE)
-public class JPAGPlainAttr extends AbstractPlainAttr implements GPlainAttr {
+public class JSONGPlainAttr extends AbstractPlainAttr implements GPlainAttr {
private static final long serialVersionUID = 2848159565890995780L;
- public static final String TABLE = "GPlainAttr";
-
- @ManyToOne(fetch = FetchType.EAGER)
+ @JsonIgnore
private JPAGroup owner;
- @OneToMany(cascade = { CascadeType.PERSIST, CascadeType.MERGE }, orphanRemoval = true, mappedBy = "attribute")
- @Valid
- private List values = new ArrayList<>();
+ /**
+ * Values of this attribute (if schema is not UNIQUE).
+ */
+ private final List values = new ArrayList<>();
- @OneToOne(cascade = CascadeType.ALL, orphanRemoval = true, mappedBy = "attribute")
- @Valid
- private JPAGPlainAttrUniqueValue uniqueValue;
+ /**
+ * Value of this attribute (if schema is UNIQUE).
+ */
+ @JsonProperty
+ private JSONGPlainAttrUniqueValue uniqueValue;
@Override
public Group getOwner() {
@@ -62,14 +56,12 @@ public Group getOwner() {
@Override
public void setOwner(final Group owner) {
- checkType(owner, JPAGroup.class);
this.owner = (JPAGroup) owner;
}
@Override
protected boolean addForMultiValue(final PlainAttrValue attrValue) {
- checkType(attrValue, JPAGPlainAttrValue.class);
- return values.add((JPAGPlainAttrValue) attrValue);
+ return values.add((JSONGPlainAttrValue) attrValue);
}
@Override
@@ -78,13 +70,41 @@ public List extends GPlainAttrValue> getValues() {
}
@Override
- public GPlainAttrUniqueValue getUniqueValue() {
+ public JSONGPlainAttrUniqueValue getUniqueValue() {
return uniqueValue;
}
+ @JsonIgnore
@Override
public void setUniqueValue(final PlainAttrUniqueValue uniqueValue) {
- checkType(uniqueValue, JPAGPlainAttrUniqueValue.class);
- this.uniqueValue = (JPAGPlainAttrUniqueValue) uniqueValue;
+ this.uniqueValue = (JSONGPlainAttrUniqueValue) uniqueValue;
+ }
+
+ @Override
+ public int hashCode() {
+ return new HashCodeBuilder().
+ appendSuper(super.hashCode()).
+ append(values).
+ append(uniqueValue).
+ build();
+ }
+
+ @Override
+ public boolean equals(final Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (obj == null) {
+ return false;
+ }
+ if (getClass() != obj.getClass()) {
+ return false;
+ }
+ final JSONGPlainAttr other = (JSONGPlainAttr) obj;
+ return new EqualsBuilder().
+ appendSuper(super.equals(obj)).
+ append(values, other.values).
+ append(uniqueValue, other.uniqueValue).
+ build();
}
}
diff --git a/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/entity/group/JPAJSONGPlainAttrUniqueValue.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/group/JSONGPlainAttrUniqueValue.java
similarity index 76%
rename from core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/entity/group/JPAJSONGPlainAttrUniqueValue.java
rename to core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/group/JSONGPlainAttrUniqueValue.java
index 539e8fb85b..a889402400 100644
--- a/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/entity/group/JPAJSONGPlainAttrUniqueValue.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/group/JSONGPlainAttrUniqueValue.java
@@ -19,22 +19,18 @@
package org.apache.syncope.core.persistence.jpa.entity.group;
import com.fasterxml.jackson.annotation.JsonIgnore;
-import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
-import com.fasterxml.jackson.annotation.JsonInclude;
import org.apache.syncope.core.persistence.api.entity.PlainAttr;
import org.apache.syncope.core.persistence.api.entity.PlainSchema;
import org.apache.syncope.core.persistence.api.entity.group.GPlainAttr;
import org.apache.syncope.core.persistence.api.entity.group.GPlainAttrUniqueValue;
import org.apache.syncope.core.persistence.jpa.entity.AbstractPlainAttrValue;
-@JsonIgnoreProperties({ "valueAsString", "value" })
-@JsonInclude(JsonInclude.Include.NON_NULL)
-public class JPAJSONGPlainAttrUniqueValue extends AbstractPlainAttrValue implements GPlainAttrUniqueValue {
+public class JSONGPlainAttrUniqueValue extends AbstractPlainAttrValue implements GPlainAttrUniqueValue {
- private static final long serialVersionUID = -4326417972859745823L;
+ private static final long serialVersionUID = 4681561795607192855L;
@JsonIgnore
- private JPAJSONGPlainAttr attr;
+ private JSONGPlainAttr attr;
@Override
public GPlainAttr getAttr() {
@@ -43,8 +39,7 @@ public GPlainAttr getAttr() {
@Override
public void setAttr(final PlainAttr> attr) {
- checkType(attr, JPAJSONGPlainAttr.class);
- this.attr = (JPAJSONGPlainAttr) attr;
+ this.attr = (JSONGPlainAttr) attr;
}
@JsonIgnore
diff --git a/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/entity/group/JPAJSONGPlainAttrValue.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/group/JSONGPlainAttrValue.java
similarity index 73%
rename from core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/entity/group/JPAJSONGPlainAttrValue.java
rename to core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/group/JSONGPlainAttrValue.java
index e662117e2b..67b1d2a3d1 100644
--- a/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/entity/group/JPAJSONGPlainAttrValue.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/group/JSONGPlainAttrValue.java
@@ -19,21 +19,17 @@
package org.apache.syncope.core.persistence.jpa.entity.group;
import com.fasterxml.jackson.annotation.JsonIgnore;
-import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
-import com.fasterxml.jackson.annotation.JsonInclude;
import org.apache.syncope.core.persistence.api.entity.PlainAttr;
import org.apache.syncope.core.persistence.api.entity.group.GPlainAttr;
import org.apache.syncope.core.persistence.api.entity.group.GPlainAttrValue;
import org.apache.syncope.core.persistence.jpa.entity.AbstractPlainAttrValue;
-@JsonIgnoreProperties({ "valueAsString", "value" })
-@JsonInclude(JsonInclude.Include.NON_NULL)
-public class JPAJSONGPlainAttrValue extends AbstractPlainAttrValue implements GPlainAttrValue {
+public class JSONGPlainAttrValue extends AbstractPlainAttrValue implements GPlainAttrValue {
- private static final long serialVersionUID = 1832825176101443555L;
+ private static final long serialVersionUID = -766808291128424707L;
@JsonIgnore
- private JPAJSONGPlainAttr attr;
+ private JSONGPlainAttr attr;
@Override
public GPlainAttr getAttr() {
@@ -42,7 +38,6 @@ public GPlainAttr getAttr() {
@Override
public void setAttr(final PlainAttr> attr) {
- checkType(attr, JPAJSONGPlainAttr.class);
- this.attr = (JPAJSONGPlainAttr) attr;
+ this.attr = (JSONGPlainAttr) attr;
}
}
diff --git a/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/entity/group/JPAJSONGroupListener.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/group/JSONGroupListener.java
similarity index 72%
rename from core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/entity/group/JPAJSONGroupListener.java
rename to core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/group/JSONGroupListener.java
index 104697a68d..f3e19d228f 100644
--- a/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/entity/group/JPAJSONGroupListener.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/group/JSONGroupListener.java
@@ -25,36 +25,36 @@
import jakarta.persistence.PrePersist;
import jakarta.persistence.PreUpdate;
import java.util.List;
-import org.apache.syncope.core.persistence.api.entity.JSONPlainAttr;
+import org.apache.syncope.core.persistence.api.entity.group.GPlainAttr;
import org.apache.syncope.core.persistence.api.entity.group.Group;
-import org.apache.syncope.core.persistence.jpa.entity.JPAJSONEntityListener;
+import org.apache.syncope.core.persistence.jpa.entity.JSONEntityListener;
import org.apache.syncope.core.provisioning.api.serialization.POJOHelper;
-public class JPAJSONGroupListener extends JPAJSONEntityListener {
+public class JSONGroupListener extends JSONEntityListener {
- protected static final TypeReference> TYPEREF =
- new TypeReference>() {
+ protected static final TypeReference> TYPEREF =
+ new TypeReference>() {
};
@Override
- protected List extends JSONPlainAttr> getAttrs(final String plainAttrsJSON) {
+ protected List extends GPlainAttr> getAttrs(final String plainAttrsJSON) {
return POJOHelper.deserialize(plainAttrsJSON, TYPEREF);
}
@PostLoad
- public void read(final JPAJSONGroup group) {
+ public void read(final JPAGroup group) {
super.json2list(group, false);
}
@PrePersist
@PreUpdate
- public void save(final JPAJSONGroup group) {
+ public void save(final JPAGroup group) {
super.list2json(group);
}
@PostPersist
@PostUpdate
- public void readAfterSave(final JPAJSONGroup group) {
+ public void readAfterSave(final JPAGroup group) {
super.json2list(group, true);
}
}
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/user/JPALAPlainAttrUniqueValue.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/user/JPALAPlainAttrUniqueValue.java
deleted file mode 100644
index 50ef6583d7..0000000000
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/user/JPALAPlainAttrUniqueValue.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.syncope.core.persistence.jpa.entity.user;
-
-import jakarta.persistence.Entity;
-import jakarta.persistence.JoinColumn;
-import jakarta.persistence.ManyToOne;
-import jakarta.persistence.OneToOne;
-import jakarta.persistence.Table;
-import org.apache.syncope.core.persistence.api.entity.PlainAttr;
-import org.apache.syncope.core.persistence.api.entity.PlainSchema;
-import org.apache.syncope.core.persistence.api.entity.user.LAPlainAttr;
-import org.apache.syncope.core.persistence.api.entity.user.LAPlainAttrUniqueValue;
-import org.apache.syncope.core.persistence.jpa.entity.AbstractPlainAttrValue;
-import org.apache.syncope.core.persistence.jpa.entity.JPAPlainSchema;
-
-@Entity
-@Table(name = JPALAPlainAttrUniqueValue.TABLE)
-public class JPALAPlainAttrUniqueValue extends AbstractPlainAttrValue implements LAPlainAttrUniqueValue {
-
- private static final long serialVersionUID = 1200617357906733442L;
-
- public static final String TABLE = "LAPlainAttrUniqueValue";
-
- @OneToOne(optional = false)
- private JPALAPlainAttr attribute;
-
- @ManyToOne(optional = false)
- @JoinColumn(name = "schema_id")
- private JPAPlainSchema schema;
-
- @Override
- public LAPlainAttr getAttr() {
- return attribute;
- }
-
- @Override
- public void setAttr(final PlainAttr> attr) {
- checkType(attr, JPALAPlainAttr.class);
- this.attribute = (JPALAPlainAttr) attr;
- }
-
- @Override
- public PlainSchema getSchema() {
- return schema;
- }
-
- @Override
- public void setSchema(final PlainSchema schema) {
- checkType(schema, JPAPlainSchema.class);
- this.schema = (JPAPlainSchema) schema;
- }
-}
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/user/JPALAPlainAttrValue.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/user/JPALAPlainAttrValue.java
deleted file mode 100644
index dcda659a1e..0000000000
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/user/JPALAPlainAttrValue.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.syncope.core.persistence.jpa.entity.user;
-
-import jakarta.persistence.Entity;
-import jakarta.persistence.ManyToOne;
-import jakarta.persistence.Table;
-import jakarta.validation.constraints.NotNull;
-import org.apache.syncope.core.persistence.api.entity.PlainAttr;
-import org.apache.syncope.core.persistence.api.entity.user.LAPlainAttr;
-import org.apache.syncope.core.persistence.api.entity.user.LAPlainAttrValue;
-import org.apache.syncope.core.persistence.jpa.entity.AbstractPlainAttrValue;
-
-@Entity
-@Table(name = JPALAPlainAttrValue.TABLE)
-public class JPALAPlainAttrValue extends AbstractPlainAttrValue implements LAPlainAttrValue {
-
- private static final long serialVersionUID = 6237793413044604262L;
-
- public static final String TABLE = "LAPlainAttrValue";
-
- @ManyToOne
- @NotNull
- private JPALAPlainAttr attribute;
-
- @Override
- public LAPlainAttr getAttr() {
- return attribute;
- }
-
- @Override
- public void setAttr(final PlainAttr> attr) {
- checkType(attr, JPALAPlainAttr.class);
- this.attribute = (JPALAPlainAttr) attr;
- }
-}
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/user/JPALinkedAccount.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/user/JPALinkedAccount.java
index 25d93d67ef..b22afe2c91 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/user/JPALinkedAccount.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/user/JPALinkedAccount.java
@@ -18,9 +18,9 @@
*/
package org.apache.syncope.core.persistence.jpa.entity.user;
-import jakarta.persistence.CascadeType;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
+import jakarta.persistence.EntityListeners;
import jakarta.persistence.EnumType;
import jakarta.persistence.Enumerated;
import jakarta.persistence.FetchType;
@@ -28,8 +28,8 @@
import jakarta.persistence.JoinTable;
import jakarta.persistence.ManyToMany;
import jakarta.persistence.ManyToOne;
-import jakarta.persistence.OneToMany;
import jakarta.persistence.Table;
+import jakarta.persistence.Transient;
import jakarta.persistence.UniqueConstraint;
import jakarta.validation.Valid;
import jakarta.validation.constraints.NotNull;
@@ -45,7 +45,7 @@
import org.apache.syncope.core.persistence.api.entity.user.LAPlainAttr;
import org.apache.syncope.core.persistence.api.entity.user.LinkedAccount;
import org.apache.syncope.core.persistence.api.entity.user.User;
-import org.apache.syncope.core.persistence.jpa.entity.AbstractGeneratedKeyEntity;
+import org.apache.syncope.core.persistence.jpa.entity.AbstractAttributable;
import org.apache.syncope.core.persistence.jpa.entity.JPAExternalResource;
import org.apache.syncope.core.persistence.jpa.entity.JPAPrivilege;
import org.apache.syncope.core.spring.ApplicationContextProvider;
@@ -55,7 +55,8 @@
@Entity
@Table(name = JPALinkedAccount.TABLE, uniqueConstraints =
@UniqueConstraint(columnNames = { "connObjectKeyValue", "resource_id" }))
-public class JPALinkedAccount extends AbstractGeneratedKeyEntity implements LinkedAccount {
+@EntityListeners({ JSONLinkedAccountListener.class })
+public class JPALinkedAccount extends AbstractAttributable implements LinkedAccount {
private static final long serialVersionUID = -5141654998687601522L;
@@ -82,9 +83,10 @@ public class JPALinkedAccount extends AbstractGeneratedKeyEntity implements Link
private Boolean suspended = false;
- @OneToMany(cascade = CascadeType.ALL, mappedBy = "account")
- @Valid
- private List plainAttrs = new ArrayList<>();
+ private String plainAttrs;
+
+ @Transient
+ private final List plainAttrsList = new ArrayList<>();
@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(joinColumns =
@@ -192,28 +194,43 @@ public Boolean isSuspended() {
return suspended;
}
+ @Override
+ public List extends LAPlainAttr> getPlainAttrsList() {
+ return plainAttrsList;
+ }
+
+ @Override
+ public String getPlainAttrsJSON() {
+ return plainAttrs;
+ }
+
+ @Override
+ public void setPlainAttrsJSON(final String plainAttrs) {
+ this.plainAttrs = plainAttrs;
+ }
+
@Override
public boolean add(final LAPlainAttr attr) {
- checkType(attr, JPALAPlainAttr.class);
- return plainAttrs.add((JPALAPlainAttr) attr);
+ checkType(attr, JSONLAPlainAttr.class);
+ return plainAttrsList.add((JSONLAPlainAttr) attr);
}
@Override
public boolean remove(final LAPlainAttr attr) {
- checkType(attr, JPALAPlainAttr.class);
- return plainAttrs.remove((JPALAPlainAttr) attr);
+ checkType(attr, JSONLAPlainAttr.class);
+ return plainAttrsList.removeIf(jsonAttr -> jsonAttr.getSchemaKey().equals(attr.getSchema().getKey()));
}
@Override
public Optional extends LAPlainAttr> getPlainAttr(final String plainSchema) {
- return getPlainAttrs().stream().
- filter(plainAttr -> plainAttr != null && plainAttr.getSchema() != null
- && plainSchema.equals(plainAttr.getSchema().getKey())).findFirst();
+ return plainAttrsList.stream().
+ filter(attr -> plainSchema.equals(attr.getSchemaKey())).
+ findFirst();
}
@Override
public List extends LAPlainAttr> getPlainAttrs() {
- return plainAttrs;
+ return plainAttrsList.stream().toList();
}
@Override
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/user/JPAUDynGroupMembership.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/user/JPAUDynGroupMembership.java
index 4eadcb8dd8..1a851cf335 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/user/JPAUDynGroupMembership.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/user/JPAUDynGroupMembership.java
@@ -19,6 +19,7 @@
package org.apache.syncope.core.persistence.jpa.entity.user;
import jakarta.persistence.Entity;
+import jakarta.persistence.OneToOne;
import jakarta.persistence.Table;
import org.apache.syncope.core.persistence.api.entity.group.Group;
import org.apache.syncope.core.persistence.api.entity.user.UDynGroupMembership;
@@ -34,7 +35,8 @@ public class JPAUDynGroupMembership extends AbstractDynMembership implemen
public static final String TABLE = "UDynGroupMembership";
- private Group group;
+ @OneToOne
+ private JPAGroup group;
@Override
public Group getGroup() {
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/user/JPAUMembership.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/user/JPAUMembership.java
index 81654b6ba5..a54a3ac981 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/user/JPAUMembership.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/user/JPAUMembership.java
@@ -18,7 +18,9 @@
*/
package org.apache.syncope.core.persistence.jpa.entity.user;
+import jakarta.persistence.Column;
import jakarta.persistence.Entity;
+import jakarta.persistence.ManyToOne;
import jakarta.persistence.Table;
import org.apache.syncope.core.persistence.api.entity.MembershipType;
import org.apache.syncope.core.persistence.api.entity.RelationshipType;
@@ -36,9 +38,13 @@ public class JPAUMembership extends AbstractGeneratedKeyEntity implements UMembe
public static final String TABLE = "UMembership";
- private User leftEnd;
+ @ManyToOne
+ @Column(name = "user_id")
+ private JPAUser leftEnd;
- private Group rightEnd;
+ @ManyToOne
+ @Column(name = "group_id")
+ private JPAGroup rightEnd;
@Override
public MembershipType getType() {
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/user/JPAUPlainAttr.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/user/JPAUPlainAttr.java
deleted file mode 100644
index 81106c14ba..0000000000
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/user/JPAUPlainAttr.java
+++ /dev/null
@@ -1,117 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.syncope.core.persistence.jpa.entity.user;
-
-import jakarta.persistence.CascadeType;
-import jakarta.persistence.Entity;
-import jakarta.persistence.FetchType;
-import jakarta.persistence.ManyToOne;
-import jakarta.persistence.OneToMany;
-import jakarta.persistence.OneToOne;
-import jakarta.persistence.Table;
-import jakarta.validation.Valid;
-import java.util.ArrayList;
-import java.util.List;
-import org.apache.syncope.core.persistence.api.entity.PlainAttrUniqueValue;
-import org.apache.syncope.core.persistence.api.entity.PlainAttrValue;
-import org.apache.syncope.core.persistence.api.entity.user.UMembership;
-import org.apache.syncope.core.persistence.api.entity.user.UPlainAttr;
-import org.apache.syncope.core.persistence.api.entity.user.UPlainAttrUniqueValue;
-import org.apache.syncope.core.persistence.api.entity.user.UPlainAttrValue;
-import org.apache.syncope.core.persistence.api.entity.user.User;
-import org.apache.syncope.core.persistence.jpa.entity.AbstractPlainAttr;
-
-@Entity
-@Table(name = JPAUPlainAttr.TABLE)
-public class JPAUPlainAttr extends AbstractPlainAttr implements UPlainAttr {
-
- private static final long serialVersionUID = 6333601983691157406L;
-
- public static final String TABLE = "UPlainAttr";
-
- /**
- * The owner of this attribute.
- */
- @ManyToOne(fetch = FetchType.EAGER)
- private JPAUser owner;
-
- /**
- * The membership of this attribute; might be {@code NULL} if this attribute is not related to a membership.
- */
- @ManyToOne(fetch = FetchType.EAGER)
- private JPAUMembership membership;
-
- /**
- * Values of this attribute (if schema is not UNIQUE).
- */
- @OneToMany(cascade = { CascadeType.PERSIST, CascadeType.MERGE }, orphanRemoval = true, mappedBy = "attribute")
- @Valid
- private List values = new ArrayList<>();
-
- /**
- * Value of this attribute (if schema is UNIQUE).
- */
- @OneToOne(cascade = CascadeType.ALL, orphanRemoval = true, mappedBy = "attribute")
- @Valid
- private JPAUPlainAttrUniqueValue uniqueValue;
-
- @Override
- public User getOwner() {
- return owner;
- }
-
- @Override
- public void setOwner(final User owner) {
- checkType(owner, JPAUser.class);
- this.owner = (JPAUser) owner;
- }
-
- @Override
- public UMembership getMembership() {
- return membership;
- }
-
- @Override
- public void setMembership(final UMembership membership) {
- checkType(membership, JPAUMembership.class);
- this.membership = (JPAUMembership) membership;
- }
-
- @Override
- protected boolean addForMultiValue(final PlainAttrValue attrValue) {
- checkType(attrValue, JPAUPlainAttrValue.class);
- return values.add((JPAUPlainAttrValue) attrValue);
- }
-
- @Override
- public List extends UPlainAttrValue> getValues() {
- return values;
- }
-
- @Override
- public UPlainAttrUniqueValue getUniqueValue() {
- return uniqueValue;
- }
-
- @Override
- public void setUniqueValue(final PlainAttrUniqueValue uniqueValue) {
- checkType(uniqueValue, JPAUPlainAttrUniqueValue.class);
- this.uniqueValue = (JPAUPlainAttrUniqueValue) uniqueValue;
- }
-}
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/user/JPAUPlainAttrUniqueValue.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/user/JPAUPlainAttrUniqueValue.java
deleted file mode 100644
index 1ea5a11d83..0000000000
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/user/JPAUPlainAttrUniqueValue.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.syncope.core.persistence.jpa.entity.user;
-
-import jakarta.persistence.Entity;
-import jakarta.persistence.JoinColumn;
-import jakarta.persistence.ManyToOne;
-import jakarta.persistence.OneToOne;
-import jakarta.persistence.Table;
-import org.apache.syncope.core.persistence.api.entity.PlainAttr;
-import org.apache.syncope.core.persistence.api.entity.PlainSchema;
-import org.apache.syncope.core.persistence.api.entity.user.UPlainAttr;
-import org.apache.syncope.core.persistence.api.entity.user.UPlainAttrUniqueValue;
-import org.apache.syncope.core.persistence.jpa.entity.AbstractPlainAttrValue;
-import org.apache.syncope.core.persistence.jpa.entity.JPAPlainSchema;
-
-@Entity
-@Table(name = JPAUPlainAttrUniqueValue.TABLE)
-public class JPAUPlainAttrUniqueValue extends AbstractPlainAttrValue implements UPlainAttrUniqueValue {
-
- private static final long serialVersionUID = -64080804563305387L;
-
- public static final String TABLE = "UPlainAttrUniqueValue";
-
- @OneToOne(optional = false)
- private JPAUPlainAttr attribute;
-
- @ManyToOne(optional = false)
- @JoinColumn(name = "schema_id")
- private JPAPlainSchema schema;
-
- @Override
- public UPlainAttr getAttr() {
- return attribute;
- }
-
- @Override
- public void setAttr(final PlainAttr> attr) {
- checkType(attr, JPAUPlainAttr.class);
- this.attribute = (JPAUPlainAttr) attr;
- }
-
- @Override
- public PlainSchema getSchema() {
- return schema;
- }
-
- @Override
- public void setSchema(final PlainSchema schema) {
- checkType(schema, JPAPlainSchema.class);
- this.schema = (JPAPlainSchema) schema;
- }
-}
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/user/JPAUPlainAttrValue.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/user/JPAUPlainAttrValue.java
deleted file mode 100644
index acb62a18b4..0000000000
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/user/JPAUPlainAttrValue.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.syncope.core.persistence.jpa.entity.user;
-
-import jakarta.persistence.Entity;
-import jakarta.persistence.ManyToOne;
-import jakarta.persistence.Table;
-import jakarta.validation.constraints.NotNull;
-import org.apache.syncope.core.persistence.api.entity.PlainAttr;
-import org.apache.syncope.core.persistence.api.entity.user.UPlainAttr;
-import org.apache.syncope.core.persistence.api.entity.user.UPlainAttrValue;
-import org.apache.syncope.core.persistence.jpa.entity.AbstractPlainAttrValue;
-
-@Entity
-@Table(name = JPAUPlainAttrValue.TABLE)
-public class JPAUPlainAttrValue extends AbstractPlainAttrValue implements UPlainAttrValue {
-
- private static final long serialVersionUID = -6259576015647897446L;
-
- public static final String TABLE = "UPlainAttrValue";
-
- @ManyToOne
- @NotNull
- private JPAUPlainAttr attribute;
-
- @Override
- public UPlainAttr getAttr() {
- return attribute;
- }
-
- @Override
- public void setAttr(final PlainAttr> attr) {
- checkType(attr, JPAUPlainAttr.class);
- this.attribute = (JPAUPlainAttr) attr;
- }
-}
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/user/JPAURelationship.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/user/JPAURelationship.java
index a7c920a399..f92a002a16 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/user/JPAURelationship.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/user/JPAURelationship.java
@@ -18,6 +18,7 @@
*/
package org.apache.syncope.core.persistence.jpa.entity.user;
+import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.FetchType;
import jakarta.persistence.ManyToOne;
@@ -44,9 +45,13 @@ public class JPAURelationship extends AbstractGeneratedKeyEntity implements URel
@ManyToOne(fetch = FetchType.EAGER, optional = false)
private JPARelationshipType type;
- private User leftEnd;
+ @ManyToOne
+ @Column(name = "user_id")
+ private JPAUser leftEnd;
- private AnyObject rightEnd;
+ @ManyToOne
+ @Column(name = "anyObject_id")
+ private JPAAnyObject rightEnd;
@Override
public RelationshipType getType() {
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/user/JPAUser.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/user/JPAUser.java
index fd1593701b..c2e50be621 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/user/JPAUser.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/user/JPAUser.java
@@ -23,6 +23,7 @@
import jakarta.persistence.CascadeType;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
+import jakarta.persistence.EntityListeners;
import jakarta.persistence.EnumType;
import jakarta.persistence.Enumerated;
import jakarta.persistence.FetchType;
@@ -33,12 +34,14 @@
import jakarta.persistence.ManyToOne;
import jakarta.persistence.OneToMany;
import jakarta.persistence.Table;
+import jakarta.persistence.Transient;
import jakarta.persistence.UniqueConstraint;
import jakarta.validation.Valid;
import jakarta.validation.constraints.NotNull;
import java.time.OffsetDateTime;
import java.util.ArrayList;
import java.util.List;
+import java.util.Objects;
import java.util.Optional;
import org.apache.syncope.common.keymaster.client.api.ConfParamOps;
import org.apache.syncope.common.lib.types.CipherAlgorithm;
@@ -67,6 +70,7 @@
@Entity
@Table(name = JPAUser.TABLE)
+@EntityListeners({ JSONUserListener.class })
@Cacheable
public class JPAUser
extends AbstractGroupableRelatable
@@ -93,9 +97,10 @@ public class JPAUser
@UniqueConstraint(columnNames = { "user_id", "role_id" }))
protected List roles = new ArrayList<>();
- @OneToMany(cascade = CascadeType.ALL, mappedBy = "owner")
- @Valid
- protected List plainAttrs = new ArrayList<>();
+ private String plainAttrs;
+
+ @Transient
+ private final List plainAttrsList = new ArrayList<>();
@Lob
protected String token;
@@ -254,16 +259,33 @@ public boolean canDecodeSecrets() {
}
@Override
- public boolean add(final UPlainAttr attr) {
- checkType(attr, JPAUPlainAttr.class);
- return plainAttrs.add((JPAUPlainAttr) attr);
+ public List extends UPlainAttr> getPlainAttrsList() {
+ return plainAttrsList;
}
@Override
- protected List extends UPlainAttr> internalGetPlainAttrs() {
+ public String getPlainAttrsJSON() {
return plainAttrs;
}
+ @Override
+ public void setPlainAttrsJSON(final String plainAttrs) {
+ this.plainAttrs = plainAttrs;
+ }
+
+ @Override
+ public boolean add(final UPlainAttr attr) {
+ checkType(attr, JSONUPlainAttr.class);
+ return plainAttrsList.add((JSONUPlainAttr) attr);
+ }
+
+ @Override
+ public boolean remove(final UPlainAttr attr) {
+ checkType(attr, JSONUPlainAttr.class);
+ return plainAttrsList.removeIf(jsonAttr -> jsonAttr.getSchemaKey().equals(attr.getSchema().getKey())
+ && Objects.equals(jsonAttr.getMembershipKey(), attr.getMembershipKey()));
+ }
+
@Override
public void generateToken(final int tokenLength, final int tokenExpireTime) {
this.token = SecureRandomUtils.generateRandomPassword(tokenLength);
@@ -451,6 +473,8 @@ public boolean add(final UMembership membership) {
@Override
public boolean remove(final UMembership membership) {
checkType(membership, JPAUMembership.class);
+ plainAttrsList.removeIf(attr -> attr.getMembershipKey() != null
+ && attr.getMembershipKey().equals(membership.getKey()));
return this.memberships.remove((JPAUMembership) membership);
}
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/user/JPALAPlainAttr.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/user/JSONLAPlainAttr.java
similarity index 62%
rename from core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/user/JPALAPlainAttr.java
rename to core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/user/JSONLAPlainAttr.java
index 6152ea2542..e0cfebfb77 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/user/JPALAPlainAttr.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/user/JSONLAPlainAttr.java
@@ -18,55 +18,43 @@
*/
package org.apache.syncope.core.persistence.jpa.entity.user;
-import jakarta.persistence.CascadeType;
-import jakarta.persistence.Entity;
-import jakarta.persistence.FetchType;
-import jakarta.persistence.ManyToOne;
-import jakarta.persistence.OneToMany;
-import jakarta.persistence.OneToOne;
-import jakarta.persistence.Table;
-import jakarta.validation.Valid;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonProperty;
import java.util.ArrayList;
import java.util.List;
+import org.apache.commons.lang3.builder.EqualsBuilder;
+import org.apache.commons.lang3.builder.HashCodeBuilder;
import org.apache.syncope.core.persistence.api.entity.PlainAttrUniqueValue;
import org.apache.syncope.core.persistence.api.entity.PlainAttrValue;
import org.apache.syncope.core.persistence.api.entity.user.LAPlainAttr;
-import org.apache.syncope.core.persistence.api.entity.user.LAPlainAttrUniqueValue;
import org.apache.syncope.core.persistence.api.entity.user.LAPlainAttrValue;
import org.apache.syncope.core.persistence.api.entity.user.LinkedAccount;
import org.apache.syncope.core.persistence.api.entity.user.User;
import org.apache.syncope.core.persistence.jpa.entity.AbstractPlainAttr;
-@Entity
-@Table(name = JPALAPlainAttr.TABLE)
-public class JPALAPlainAttr extends AbstractPlainAttr implements LAPlainAttr {
+public class JSONLAPlainAttr extends AbstractPlainAttr implements LAPlainAttr {
private static final long serialVersionUID = 7827533741035423694L;
- public static final String TABLE = "LAPlainAttr";
-
/**
* The owner of this attribute.
*/
- @ManyToOne(fetch = FetchType.EAGER)
+ @JsonIgnore
private JPAUser owner;
- @ManyToOne(fetch = FetchType.EAGER)
+ @JsonIgnore
private JPALinkedAccount account;
/**
* Values of this attribute (if schema is not UNIQUE).
*/
- @OneToMany(cascade = CascadeType.MERGE, orphanRemoval = true, mappedBy = "attribute")
- @Valid
- private List