diff --git a/ccm-core/src/main/java/org/libreccm/core/AbstractEntityRepository.java b/ccm-core/src/main/java/org/libreccm/core/AbstractEntityRepository.java index 1f303a273..eb3216c76 100644 --- a/ccm-core/src/main/java/org/libreccm/core/AbstractEntityRepository.java +++ b/ccm-core/src/main/java/org/libreccm/core/AbstractEntityRepository.java @@ -249,6 +249,21 @@ public abstract class AbstractEntityRepository implements Serializable { return executeCriteriaQuery(createCriteriaQuery()); } + @Transactional(Transactional.TxType.REQUIRED) + public long countAll() { + final CriteriaBuilder criteriaBuilder = entityManager + .getCriteriaBuilder(); + final CriteriaQuery criteriaQuery = criteriaBuilder.createQuery( + Long.class + ); + criteriaQuery + .select( + criteriaBuilder.count(criteriaQuery.from(getEntityClass())) + ); + + return entityManager.createQuery(criteriaQuery).getSingleResult(); + } + public List findAll(final int limit, final int offset) { return executeCriteriaQuery(createCriteriaQuery(), limit, offset); } diff --git a/ccm-core/src/main/java/org/libreccm/l10n/LocalizedString.java b/ccm-core/src/main/java/org/libreccm/l10n/LocalizedString.java index 79056815a..43b8eb478 100644 --- a/ccm-core/src/main/java/org/libreccm/l10n/LocalizedString.java +++ b/ccm-core/src/main/java/org/libreccm/l10n/LocalizedString.java @@ -35,6 +35,7 @@ import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; + import java.io.Serializable; import java.util.Collections; import java.util.HashMap; @@ -45,6 +46,10 @@ import java.util.Set; import static org.libreccm.l10n.L10NConstants.L10N_XML_NS; +import javax.json.Json; +import javax.json.JsonObject; +import javax.json.JsonObjectBuilder; + /** * A helper class for localisable string properties. This class is declared as * embeddable, so that it can be used in every other entity. The localised @@ -202,6 +207,25 @@ public class LocalizedString implements Serializable { return obj instanceof LocalizedString; } + public JsonObject toJson() { + return buildJson().build(); + } + + public JsonObjectBuilder buildJson() { + final JsonObjectBuilder builder = Json.createObjectBuilder(); + + values + .entrySet() + .stream() + .forEach( + entry -> builder.add( + Objects.toString(entry.getKey()), entry.getValue() + ) + ); + + return builder; + } + @Override public String toString() { return String.format( diff --git a/ccm-core/src/main/java/org/libreccm/security/GroupMembership.java b/ccm-core/src/main/java/org/libreccm/security/GroupMembership.java index f32603937..e8557e268 100644 --- a/ccm-core/src/main/java/org/libreccm/security/GroupMembership.java +++ b/ccm-core/src/main/java/org/libreccm/security/GroupMembership.java @@ -165,7 +165,6 @@ public class GroupMembership implements Serializable, Exportable { } public JsonObjectBuilder buildJson() { - return Json .createObjectBuilder() .add("membershipId", membershipId) diff --git a/ccm-core/src/main/java/org/libreccm/security/Permission.java b/ccm-core/src/main/java/org/libreccm/security/Permission.java index 6d2b8991b..4fc40dabd 100644 --- a/ccm-core/src/main/java/org/libreccm/security/Permission.java +++ b/ccm-core/src/main/java/org/libreccm/security/Permission.java @@ -40,6 +40,14 @@ import static org.libreccm.core.CoreConstants.DB_SCHEMA; import com.fasterxml.jackson.annotation.ObjectIdGenerators; import org.libreccm.imexport.Exportable; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.time.format.DateTimeFormatter; + +import javax.json.Json; +import javax.json.JsonObject; +import javax.json.JsonObjectBuilder; +import javax.json.JsonValue; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; @@ -63,48 +71,40 @@ import javax.persistence.TemporalType; @Table(name = "PERMISSIONS", schema = DB_SCHEMA) @NamedQueries({ @NamedQuery(name = "Permission.findByUuid", - query = "SELECT p FROM Permission p WHERE p.uuid = :uuid") - , + query = "SELECT p FROM Permission p WHERE p.uuid = :uuid"), @NamedQuery(name = "Permission.findByCustomPermId", query = "SELECT p FROM Permission p " + "WHERE p.grantedPrivilege = :privilege " + "AND p.grantee = :grantee " - + "AND p.object = :object") - , + + "AND p.object = :object"), @NamedQuery(name = "Permission.existsForPrivilegeRoleObject", query = "SELECT COUNT(p) FROM Permission p " + "WHERE p.grantedPrivilege = :privilege " + "AND p.grantee = :grantee " - + "AND p.object = :object") - , + + "AND p.object = :object"), @NamedQuery(name = "Permission.existsDirectForPrivilegeRoleObject", query = "SELECT COUNT(p) FROM Permission p " + "WHERE p.grantedPrivilege = :privilege " + "AND p.grantee = :grantee " + "AND p.object = :object " - + "AND p.inherited = false") - , + + "AND p.inherited = false"), @NamedQuery(name = "Permission.existsInheritedForPrivilegeRoleObject", query = "SELECT COUNT(p) FROM Permission p " + "WHERE p.grantedPrivilege = :privilege " + "AND p.grantee = :grantee " + "AND p.object = :object " - + "AND p.inherited = true") - , + + "AND p.inherited = true"), @NamedQuery(name = "Permission.existsForPrivilegeAndRole", query = "SELECT COUNT(p) FROM Permission p " + "WHERE p.grantedPrivilege = :privilege " + "AND p.grantee = :grantee " - + "AND p.object IS NULL") - , + + "AND p.object IS NULL"), @NamedQuery(name = "Permission.findPermissionsForRole", query = "SELECT p FROM Permission p " - + "WHERE p.grantee = :grantee") - , + + "WHERE p.grantee = :grantee"), @NamedQuery(name = "Permission.findPermissionsForCcmObject", query = "SELECT p FROM Permission p " - + "WHERE p.object = :object") - , + + "WHERE p.object = :object"), @NamedQuery(name = "Permission.findPermissionsForRoleAndObject", query = "SELECT p FROM Permission p " + "WHERE p.object = :object and p.grantee = :grantee") @@ -337,6 +337,78 @@ public class Permission implements Serializable, Exportable { return obj instanceof Permission; } + public JsonObjectBuilder buildJson() { + final JsonObjectBuilder builder = Json + .createObjectBuilder() + .add("permissionId", permissionId) + .add("uuid", uuid) + .add("grantedPrivilege", grantedPrivilege) + .add("inherited", inherited); + + if (object != null) { + builder.add( + "object", + Json + .createObjectBuilder() + .add("objectId", object.getObjectId()) + .add("uuid", object.getUuid()) + .add("dispayName", object.getDisplayName()) + ); + } + + builder.add( + "grantee", + Json + .createObjectBuilder() + .add("roleId", grantee.getRoleId()) + .add("uuid", grantee.getUuid()) + .add("name", grantee.getName()) + ); + + if (creationUser != null) { + builder.add( + "creationUser", + Json + .createObjectBuilder() + .add("partyId", creationUser.getPartyId()) + .add("uuid", creationUser.getUuid()) + .add("name", creationUser.getName()) + ); + } + + if (creationDate != null) { + final LocalDateTime dateTime = creationDate + .toInstant() + .atZone(ZoneId.systemDefault()) + .toLocalDateTime(); + builder.add( + "creationDate", + DateTimeFormatter.ISO_DATE_TIME.format(dateTime) + ); + } + + if (creationIp != null) { + builder.add("creationIp", creationIp); + } + + if (inherited && inheritedFrom != null) { + builder.add( + "inheritedFrom", + Json + .createObjectBuilder() + .add("objectId", inheritedFrom.getObjectId()) + .add("uuid", inheritedFrom.getUuid()) + .add("dispayName", inheritedFrom.getDisplayName()) + ); + } + + return builder; + } + + public JsonObject toJson() { + return buildJson().build(); + } + @Override public String toString() { return String.format("%s{ " diff --git a/ccm-core/src/main/java/org/libreccm/security/Role.java b/ccm-core/src/main/java/org/libreccm/security/Role.java index 2a98a695e..eda94d92a 100644 --- a/ccm-core/src/main/java/org/libreccm/security/Role.java +++ b/ccm-core/src/main/java/org/libreccm/security/Role.java @@ -28,6 +28,7 @@ import org.libreccm.workflow.TaskAssignment; import static org.libreccm.core.CoreConstants.CORE_XML_NS; import static org.libreccm.core.CoreConstants.DB_SCHEMA; +import org.libreccm.core.api.JsonArrayCollector; import org.libreccm.imexport.Exportable; import java.io.Serializable; @@ -38,6 +39,9 @@ import java.util.List; import java.util.Objects; import java.util.Set; +import javax.json.Json; +import javax.json.JsonObject; +import javax.json.JsonObjectBuilder; import javax.persistence.AssociationOverride; import javax.persistence.Column; import javax.persistence.Embedded; @@ -350,6 +354,40 @@ public class Role implements Serializable, Exportable { public boolean canEqual(final Object obj) { return obj instanceof Role; } + + public JsonObjectBuilder buildJson() { + return Json + .createObjectBuilder() + .add("roleId", roleId) + .add("uuid", uuid) + .add("name", name) + .add("description", description.buildJson()) + .add( + "memberships", + memberships + .stream() + .map(RoleMembership::toJson) + .collect(new JsonArrayCollector()) + ) + .add( + "permissions", + permissions + .stream() + .map(Permission::toJson) + .collect(new JsonArrayCollector()) + ) + .add( + "assignedTasks", + assignedTasks + .stream() + .map(TaskAssignment::toJson) + .collect(new JsonArrayCollector()) + ); + } + + public JsonObject toJson() { + return buildJson().build(); + } @Override public String toString() { diff --git a/ccm-core/src/main/java/org/libreccm/workflow/TaskAssignment.java b/ccm-core/src/main/java/org/libreccm/workflow/TaskAssignment.java index 5fc891841..8920535d2 100644 --- a/ccm-core/src/main/java/org/libreccm/workflow/TaskAssignment.java +++ b/ccm-core/src/main/java/org/libreccm/workflow/TaskAssignment.java @@ -30,6 +30,9 @@ import static org.libreccm.core.CoreConstants.DB_SCHEMA; import com.fasterxml.jackson.annotation.ObjectIdGenerators; import org.libreccm.imexport.Exportable; +import javax.json.Json; +import javax.json.JsonObject; +import javax.json.JsonObjectBuilder; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; @@ -41,7 +44,7 @@ import javax.persistence.Table; /** * Represents the assignment of a {@link AssignableTask} to a {@link Role}. - * + * * @author Jens Pelzetter */ @Entity @@ -62,7 +65,7 @@ public class TaskAssignment implements Serializable, Exportable { @Column(name = "UUID", unique = true, nullable = false) private String uuid; - + /** * The task. */ @@ -86,7 +89,7 @@ public class TaskAssignment implements Serializable, Exportable { protected void setTaskAssignmentId(final long taskAssignmentId) { this.taskAssignmentId = taskAssignmentId; } - + @Override public String getUuid() { return uuid; @@ -95,7 +98,6 @@ public class TaskAssignment implements Serializable, Exportable { protected void setUuid(final String uuid) { this.uuid = uuid; } - public AssignableTask getTask() { return task; @@ -150,6 +152,41 @@ public class TaskAssignment implements Serializable, Exportable { return obj instanceof TaskAssignment; } + public JsonObjectBuilder buildJson() { + final JsonObjectBuilder builder = Json + .createObjectBuilder() + .add("taskAssignmentId", taskAssignmentId) + .add("uuid", uuid); + + if (task != null) { + builder.add( + "task", + Json + .createObjectBuilder() + .add("taskId", task.getTaskId()) + .add("uuid", task.getUuid()) + .add("label", task.getLabel().buildJson()) + ); + } + + if (role != null) { + builder.add( + "role", + Json + .createObjectBuilder() + .add("roleId", role.getRoleId()) + .add("uuid", role.getUuid()) + .add("name", role.getName()) + ); + } + + return builder; + } + + public JsonObject toJson() { + return buildJson().build(); + } + @Override public String toString() { return String.format("%s{ "