- adds new export content for import to tests resources
- exchanges Jackson back- and managed-reference annotations with identityInfo, ignore and identityReference annotations 
- adds necessary ObjectIdGenerator and ObjectIdResolver implementations
- does not yet implement the generateId-Method of every ObjectIdResolver

git-svn-id: https://svn.libreccm.org/ccm/ccm_ng@4640 8810af33-2d31-482b-a856-94f89814c4df

Former-commit-id: 834952bc85
pull/2/head
tosmers 2017-03-23 18:48:52 +00:00
parent a8453eb9e0
commit 9ff883ed25
45 changed files with 48481 additions and 40614 deletions

View File

@ -19,6 +19,8 @@
package org.libreccm.categorization;
import com.fasterxml.jackson.annotation.JsonBackReference;
import com.fasterxml.jackson.annotation.JsonIdentityInfo;
import com.fasterxml.jackson.annotation.JsonIdentityReference;
import org.libreccm.core.CcmObject;
import org.libreccm.portation.Portable;
@ -96,6 +98,8 @@ import javax.persistence.FetchType;
+ "WHERE c.category = :category "
+ "AND c.index = TRUE")
})
@JsonIdentityInfo(generator = CategorizationIdGenerator.class,
property = "customCatId")
public class Categorization implements Serializable, Relation, Portable {
private static final long serialVersionUID = 201504301320L;
@ -113,7 +117,7 @@ public class Categorization implements Serializable, Relation, Portable {
*/
@ManyToOne
@JoinColumn(name = "CATEGORY_ID")
@JsonBackReference(value = "category-categorization")
@JsonIdentityReference(alwaysAsId = true)
private Category category;
/**
@ -121,7 +125,7 @@ public class Categorization implements Serializable, Relation, Portable {
*/
@ManyToOne
@JoinColumn(name = "OBJECT_ID")
@JsonBackReference(value = "object-categorization")
@JsonIdentityReference(alwaysAsId = true)
private CcmObject categorizedObject;
/**

View File

@ -0,0 +1,69 @@
/*
* Copyright (C) 2015 LibreCCM Foundation.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301 USA
*/
package org.libreccm.categorization;
import com.fasterxml.jackson.annotation.ObjectIdGenerator;
/**
* @author <a href="mailto:tosmers@uni-bremen.de>Tobias Osmers</a>
* @version created on 3/23/17
*/
public class CategorizationIdGenerator extends ObjectIdGenerator<String> {
@Override
public Class<?> getScope() {
return Categorization.class;
}
@Override
public boolean canUseFor(ObjectIdGenerator<?> gen) {
return gen instanceof CategorizationIdGenerator;
}
@Override
public ObjectIdGenerator<String> forScope(Class<?> scope) {
return this;
}
@Override
public ObjectIdGenerator<String> newForSerialization(Object context) {
return this;
}
@Override
public IdKey key(Object key) {
if (key == null) {
return null;
}
return new IdKey(Categorization.class, Categorization.class, key);
}
@Override
public String generateId(Object forPojo) {
if (!(forPojo instanceof Categorization)) {
throw new IllegalArgumentException(
"Only Categorization instances are supported.");
}
final Categorization categorization = (Categorization) forPojo;
return String.format("{%s}{%s}",
categorization.getCategory().getUuid(),
categorization.getCategorizedObject().getUuid());
}
}

View File

@ -18,23 +18,16 @@
*/
package org.libreccm.categorization;
import static org.libreccm.categorization.CategorizationConstants.*;
import static org.libreccm.core.CoreConstants.*;
import com.fasterxml.jackson.annotation.JsonBackReference;
import com.fasterxml.jackson.annotation.JsonManagedReference;
import com.fasterxml.jackson.annotation.JsonIdentityInfo;
import com.fasterxml.jackson.annotation.JsonIdentityReference;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.ObjectIdGenerators;
import org.hibernate.validator.constraints.NotBlank;
import org.libreccm.core.CcmObject;
import org.libreccm.l10n.LocalizedString;
import org.libreccm.portation.Portable;
import org.libreccm.security.RecursivePermissions;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Objects;
import javax.persistence.AssociationOverride;
import javax.persistence.Column;
import javax.persistence.Embedded;
@ -54,6 +47,14 @@ import javax.validation.constraints.Pattern;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlRootElement;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Objects;
import static org.libreccm.categorization.CategorizationConstants.CAT_XML_NS;
import static org.libreccm.core.CoreConstants.DB_SCHEMA;
/**
* The category entity represents a single category. Each category is part of a
@ -138,6 +139,9 @@ import javax.xml.bind.annotation.XmlRootElement;
)
})
@XmlRootElement(name = "category", namespace = CAT_XML_NS)
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class,
resolver = CategoryIdResolver.class,
property = "uuid")
public class Category extends CcmObject implements Serializable, Portable {
private static final long serialVersionUID = -7250208963391878547L;
@ -218,7 +222,7 @@ public class Category extends CcmObject implements Serializable, Portable {
@RecursivePermissions
@OneToMany(mappedBy = "category", fetch = FetchType.LAZY)
@XmlElementWrapper(name = "objects", namespace = CAT_XML_NS)
@JsonManagedReference(value = "category-categorization")
@JsonIgnore
private List<Categorization> objects;
/**
@ -228,7 +232,7 @@ public class Category extends CcmObject implements Serializable, Portable {
@OneToMany(mappedBy = "parentCategory", fetch = FetchType.LAZY)
@XmlElementWrapper(name = "subcategories", namespace = CAT_XML_NS)
@XmlElement(name = "category")
@JsonManagedReference(value = "subcategory-parentcategory")
@JsonIgnore
private List<Category> subCategories;
/**
@ -237,7 +241,7 @@ public class Category extends CcmObject implements Serializable, Portable {
*/
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "PARENT_CATEGORY_ID")
@JsonBackReference(value = "subcategory-parentcategory")
@JsonIdentityReference(alwaysAsId = true)
private Category parentCategory;
/**

View File

@ -0,0 +1,58 @@
/*
* Copyright (C) 2015 LibreCCM Foundation.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301 USA
*/
package org.libreccm.categorization;
import com.fasterxml.jackson.annotation.ObjectIdGenerator;
import com.fasterxml.jackson.annotation.ObjectIdResolver;
import javax.enterprise.context.RequestScoped;
import javax.inject.Inject;
/**
* @author <a href="mailto:tosmers@uni-bremen.de>Tobias Osmers</a>
* @version created on 3/23/17
*/
@RequestScoped
public class CategoryIdResolver implements ObjectIdResolver {
@Inject
private CategoryRepository categoryRepository;
@Override
public void bindItem(ObjectIdGenerator.IdKey idKey,
Object pojo) {
// According to the Jackson JavaDoc, this method can be used to keep
// track of objects directly in a resolver implementation. We don't need
// this here therefore this method is empty.
}
@Override
public Object resolveId(ObjectIdGenerator.IdKey id) {
return null;
}
@Override
public ObjectIdResolver newForDeserialization(Object context) {
return new CategoryIdResolver();
}
@Override
public boolean canUseFor(ObjectIdResolver resolverType) {
return resolverType instanceof CategoryIdResolver;
}
}

View File

@ -18,8 +18,9 @@
*/
package org.libreccm.core;
import com.fasterxml.jackson.annotation.JsonBackReference;
import com.fasterxml.jackson.annotation.JsonManagedReference;
import com.fasterxml.jackson.annotation.JsonIdentityInfo;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.ObjectIdGenerators;
import org.hibernate.envers.Audited;
import org.hibernate.search.annotations.Field;
import org.hibernate.search.annotations.IndexedEmbedded;
@ -83,6 +84,9 @@ import static org.libreccm.core.CoreConstants.DB_SCHEMA;
//persistence system we can't yet refactor it to make PMD happy. Also I think
//this is a false warning.
@SuppressWarnings("PMD.TooManyMethods")
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class,
resolver = CcmObjectIdResolver.class,
property = "uuid")
public class CcmObject implements Identifiable, Serializable {
private static final long serialVersionUID = 201504261329L;
@ -122,7 +126,7 @@ public class CcmObject implements Identifiable, Serializable {
@IndexedEmbedded(includePaths = {"grantedPrivilege", "grantee.name"})
@XmlElementWrapper(name = "permissions", namespace = CORE_XML_NS)
@XmlElement(name = "permission", namespace = CORE_XML_NS)
@JsonManagedReference(value = "object-permission")
@JsonIgnore
private List<Permission> permissions;
/**
@ -131,7 +135,7 @@ public class CcmObject implements Identifiable, Serializable {
@OneToMany(mappedBy = "categorizedObject")
@XmlElementWrapper(name = "categories", namespace = CORE_XML_NS)
@XmlElement(name = "category", namespace = CORE_XML_NS)
@JsonManagedReference(value = "object-categorization")
@JsonIgnore
private List<Categorization> categories;
public CcmObject() {

View File

@ -0,0 +1,51 @@
/*
* Copyright (C) 2015 LibreCCM Foundation.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301 USA
*/
package org.libreccm.core;
import com.fasterxml.jackson.annotation.ObjectIdGenerator;
import com.fasterxml.jackson.annotation.ObjectIdResolver;
/**
* @author <a href="mailto:tosmers@uni-bremen.de>Tobias Osmers</a>
* @version created on 3/23/17
*/
public class CcmObjectIdResolver implements ObjectIdResolver {
@Override
public void bindItem(ObjectIdGenerator.IdKey idKey,
Object pojo) {
// According to the Jackson JavaDoc, this method can be used to keep
// track of objects directly in a resolver implementation. We don't need
// this here therefore this method is empty.
}
@Override
public Object resolveId(ObjectIdGenerator.IdKey id) {
return null;
}
@Override
public ObjectIdResolver newForDeserialization(Object context) {
return new CcmObjectIdResolver();
}
@Override
public boolean canUseFor(ObjectIdResolver resolverType) {
return resolverType instanceof CcmObjectIdResolver;
}
}

View File

@ -18,7 +18,9 @@
*/
package org.libreccm.security;
import com.fasterxml.jackson.annotation.JsonManagedReference;
import com.fasterxml.jackson.annotation.JsonIdentityInfo;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.ObjectIdGenerators;
import org.libreccm.portation.Portable;
import javax.persistence.Entity;
@ -33,7 +35,6 @@ import javax.persistence.Table;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlRootElement;
import java.io.Serializable;
import java.util.Collections;
import java.util.HashSet;
@ -89,6 +90,9 @@ import static org.libreccm.core.CoreConstants.DB_SCHEMA;
})
})
@XmlRootElement(name = "user-group", namespace = CORE_XML_NS)
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class,
resolver = GroupIdResolver.class,
property = "name")
public class Group extends Party implements Serializable, Portable {
private static final long serialVersionUID = -4800759206452780739L;
@ -100,7 +104,7 @@ public class Group extends Party implements Serializable, Portable {
@OneToMany(mappedBy = "group")
@XmlElementWrapper(name = "group-memberships", namespace = CORE_XML_NS)
@XmlElement(name = "group-membership", namespace = CORE_XML_NS)
@JsonManagedReference(value = "group-groupmembership")
@JsonIgnore
private Set<GroupMembership> memberships = new HashSet<>();
public Group() {

View File

@ -0,0 +1,51 @@
/*
* Copyright (C) 2015 LibreCCM Foundation.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301 USA
*/
package org.libreccm.security;
import com.fasterxml.jackson.annotation.ObjectIdGenerator;
import com.fasterxml.jackson.annotation.ObjectIdResolver;
/**
* @author <a href="mailto:tosmers@uni-bremen.de>Tobias Osmers</a>
* @version created on 3/23/17
*/
public class GroupIdResolver implements ObjectIdResolver {
@Override
public void bindItem(final ObjectIdGenerator.IdKey id,
final Object pojo) {
// According to the Jackson JavaDoc, this method can be used to keep
// track of objects directly in a resolver implementation. We don't need
// this here therefore this method is empty.
}
@Override
public Object resolveId(final ObjectIdGenerator.IdKey id) {
return null;
}
@Override
public ObjectIdResolver newForDeserialization(final Object context) {
return new GroupIdResolver();
}
@Override
public boolean canUseFor(final ObjectIdResolver objectIdResolver) {
return objectIdResolver instanceof GroupIdResolver;
}
}

View File

@ -44,6 +44,7 @@ public class GroupMarshaller extends AbstractMarshaller<Group> {
@Override
@Transactional(Transactional.TxType.REQUIRED)
protected void insertIntoDb(Group portableObject) {
portableObject.setPartyId(portableObject.getPartyId() * -1);
groupRepository.save(portableObject);
}
}

View File

@ -18,8 +18,8 @@
*/
package org.libreccm.security;
import com.fasterxml.jackson.annotation.JsonBackReference;
import com.fasterxml.jackson.annotation.JsonManagedReference;
import com.fasterxml.jackson.annotation.JsonIdentityInfo;
import com.fasterxml.jackson.annotation.JsonIdentityReference;
import org.libreccm.portation.Portable;
import javax.persistence.Column;
@ -54,6 +54,8 @@ import static org.libreccm.core.CoreConstants.DB_SCHEMA;
query = "SELECT m FROM GroupMembership m "
+ "WHERE m.member = :member AND m.group = :group")})
@XmlRootElement(name = "group-membership", namespace = CORE_XML_NS)
@JsonIdentityInfo(generator = GroupMembershipIdGenerator.class,
property = "customMemId")
public class GroupMembership implements Serializable, Portable {
private static final long serialVersionUID = 83192968306850665L;
@ -67,13 +69,13 @@ public class GroupMembership implements Serializable, Portable {
@ManyToOne
@JoinColumn(name = "GROUP_ID")
@XmlTransient
@JsonBackReference(value = "group-groupmembership")
@JsonIdentityReference(alwaysAsId = true)
private Group group;
@ManyToOne
@JoinColumn(name = "MEMBER_ID")
@XmlTransient
@JsonBackReference(value = "user-groupmembership")
@JsonIdentityReference(alwaysAsId = true)
private User member;
public long getMembershipId() {

View File

@ -0,0 +1,69 @@
/*
* Copyright (C) 2015 LibreCCM Foundation.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301 USA
*/
package org.libreccm.security;
import com.fasterxml.jackson.annotation.ObjectIdGenerator;
/**
* @author <a href="mailto:tosmers@uni-bremen.de>Tobias Osmers</a>
* @version created on 3/23/17
*/
public class GroupMembershipIdGenerator extends ObjectIdGenerator<String> {
@Override
public Class<?> getScope() {
return GroupMembership.class;
}
@Override
public boolean canUseFor(final ObjectIdGenerator<?> gen) {
return gen instanceof GroupMembershipIdGenerator;
}
@Override
public ObjectIdGenerator<String> forScope(final Class<?> scope) {
return this;
}
@Override
public ObjectIdGenerator<String> newForSerialization(final Object context) {
return this;
}
@Override
public IdKey key(final Object key) {
if (key == null) {
return null;
}
return new IdKey(GroupMembership.class, GroupMembership.class, key);
}
@Override
public String generateId(final Object forPojo) {
if (!(forPojo instanceof GroupMembership)) {
throw new IllegalArgumentException(
"Only GroupMembership instances are supported.");
}
final GroupMembership membership = (GroupMembership) forPojo;
return String.format("{%s}{%s}",
membership.getGroup().getName(),
membership.getMember().getName());
}
}

View File

@ -45,10 +45,7 @@ public class GroupMembershipMarshaller extends AbstractMarshaller<GroupMembershi
@Override
@Transactional(Transactional.TxType.REQUIRED)
protected void insertIntoDb(GroupMembership portableObject) {
if (portableObject.getMembershipId() == 0) {
entityManager.persist(portableObject);
} else {
entityManager.merge(portableObject);
}
portableObject.setMembershipId(portableObject.getMembershipId() * -1);
entityManager.merge(portableObject);
}
}

View File

@ -18,7 +18,9 @@
*/
package org.libreccm.security;
import com.fasterxml.jackson.annotation.JsonManagedReference;
import com.fasterxml.jackson.annotation.JsonIdentityInfo;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.ObjectIdGenerators;
import javax.persistence.Column;
import javax.persistence.Entity;
@ -38,7 +40,6 @@ import javax.validation.constraints.NotNull;
import javax.validation.constraints.Pattern;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
import java.io.Serializable;
import java.util.Collections;
import java.util.HashSet;
@ -73,6 +74,9 @@ import static org.libreccm.core.CoreConstants.DB_SCHEMA;
attributeNodes = @NamedAttributeNode(
value = "roleMemberships"))
})
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class,
resolver = PartyIdResolver.class,
property = "name")
public class Party implements Serializable {
private static final long serialVersionUID = 3319997992281332204L;
@ -97,7 +101,7 @@ public class Party implements Serializable {
@OneToMany(mappedBy = "member")
@XmlElementWrapper(name = "role-memberships", namespace = CORE_XML_NS)
@XmlElement(name = "role-membership", namespace = CORE_XML_NS)
@JsonManagedReference(value = "party-rolemembership")
@JsonIgnore
private Set<RoleMembership> roleMemberships = new HashSet<>();
protected Party() {

View File

@ -0,0 +1,52 @@
/*
* Copyright (C) 2015 LibreCCM Foundation.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301 USA
*/
package org.libreccm.security;
import com.fasterxml.jackson.annotation.ObjectIdGenerator;
import com.fasterxml.jackson.annotation.ObjectIdResolver;
/**
* @author <a href="mailto:tosmers@uni-bremen.de>Tobias Osmers</a>
* @version created on 3/23/17
*/
public class PartyIdResolver implements ObjectIdResolver {
@Override
public void bindItem(final ObjectIdGenerator.IdKey id,
final Object pojo) {
// According to the Jackson JavaDoc, this method can be used to keep
// track of objects directly in a resolver implementation. We don't need
// this here therefore this method is empty.
}
@Override
public Object resolveId(final ObjectIdGenerator.IdKey id) {
// Find the user for the id (don't confuse that with the primary key!).
return null;
}
@Override
public ObjectIdResolver newForDeserialization(final Object context) {
return new PartyIdResolver();
}
@Override
public boolean canUseFor(final ObjectIdResolver resolverType) {
return resolverType instanceof PartyIdResolver;
}
}

View File

@ -18,7 +18,8 @@
*/
package org.libreccm.security;
import com.fasterxml.jackson.annotation.JsonBackReference;
import com.fasterxml.jackson.annotation.JsonIdentityInfo;
import com.fasterxml.jackson.annotation.JsonIdentityReference;
import org.hibernate.search.annotations.ContainedIn;
import org.hibernate.search.annotations.Field;
import org.hibernate.search.annotations.IndexedEmbedded;
@ -34,6 +35,7 @@ import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToOne;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
@ -41,7 +43,6 @@ import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import java.io.Serializable;
import java.util.Date;
import java.util.Objects;
@ -49,8 +50,6 @@ import java.util.Objects;
import static org.libreccm.core.CoreConstants.CORE_XML_NS;
import static org.libreccm.core.CoreConstants.DB_SCHEMA;
import javax.persistence.OneToOne;
/**
* A permission grants a privilege on an object or system wide to {@link Role}.
*
@ -100,6 +99,9 @@ import javax.persistence.OneToOne;
})
@XmlRootElement(name = "permission", namespace = CORE_XML_NS)
@XmlAccessorType(XmlAccessType.FIELD)
@JsonIdentityInfo(generator = PermissionIdGenerator.class,
resolver = PermissionIdResolver.class,
property = "customPermId")
public class Permission implements Serializable, Portable {
private static final long serialVersionUID = -5178045844045517958L;
@ -127,7 +129,7 @@ public class Permission implements Serializable, Portable {
@ManyToOne
@JoinColumn(name = "OBJECT_ID")
@ContainedIn
@JsonBackReference(value = "object-permission")
@JsonIdentityReference(alwaysAsId = true)
private CcmObject object;
/**
@ -136,7 +138,7 @@ public class Permission implements Serializable, Portable {
@ManyToOne
@IndexedEmbedded
@JoinColumn(name = "GRANTEE_ID")
@JsonBackReference(value = "role-permission")
@JsonIdentityReference(alwaysAsId = true)
private Role grantee;
/**

View File

@ -0,0 +1,83 @@
/*
* Copyright (C) 2015 LibreCCM Foundation.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301 USA
*/
package org.libreccm.security;
import com.fasterxml.jackson.annotation.ObjectIdGenerator;
/**
* @author <a href="mailto:tosmers@uni-bremen.de>Tobias Osmers</a>
* @version created on 3/23/17
*/
public class PermissionIdGenerator extends ObjectIdGenerator<String> {
@Override
public Class<?> getScope() {
return Permission.class;
}
@Override
public boolean canUseFor(final ObjectIdGenerator<?> gen) {
return gen instanceof PermissionIdGenerator;
}
@Override
public ObjectIdGenerator<String> forScope(final Class<?> scope) {
return this;
}
@Override
public ObjectIdGenerator<String> newForSerialization(final Object context) {
return this;
}
@Override
public IdKey key(final Object key) {
if (key == null) {
return null;
}
return new IdKey(Permission.class, Permission.class, key);
}
@Override
public String generateId(final Object forPojo) {
if (!(forPojo instanceof Permission)) {
throw new IllegalArgumentException(
"Only Permission instances are supported.");
}
final Permission permission = (Permission) forPojo;
String id = permission.getGrantedPrivilege() +
permission.getPermissionId();
boolean a = false, b = false;
if (permission.getObject() != null) {
id += permission.getObject().getUuid();
a = true;
}
if (permission.getGrantee() != null) {
id += permission.getGrantee().getName();
b = true;
}
// if (!(a || b)) {
// throw new IllegalStateException();
// }
return id;
}
}

View File

@ -0,0 +1,52 @@
/*
* Copyright (C) 2015 LibreCCM Foundation.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301 USA
*/
package org.libreccm.security;
import com.fasterxml.jackson.annotation.ObjectIdGenerator;
import com.fasterxml.jackson.annotation.ObjectIdResolver;
/**
* @author <a href="mailto:tosmers@uni-bremen.de>Tobias Osmers</a>
* @version created on 3/23/17
*/
public class PermissionIdResolver implements ObjectIdResolver {
@Override
public void bindItem(final ObjectIdGenerator.IdKey id,
final Object pojo) {
// According to the Jackson JavaDoc, this method can be used to keep
// track of objects directly in a resolver implementation. We don't need
// this here therefore this method is empty.
}
@Override
public Object resolveId(final ObjectIdGenerator.IdKey id) {
// Find the user for the id (don't confuse that with the primary key!).
return null;
}
@Override
public ObjectIdResolver newForDeserialization(final Object context) {
return new PermissionIdResolver();
}
@Override
public boolean canUseFor(final ObjectIdResolver resolverType) {
return resolverType instanceof PermissionIdResolver;
}
}

View File

@ -18,7 +18,10 @@
*/
package org.libreccm.security;
import com.fasterxml.jackson.annotation.JsonManagedReference;
import com.fasterxml.jackson.annotation.JsonIdentityInfo;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.ObjectIdGenerators;
import org.hibernate.search.annotations.Field;
import org.hibernate.validator.constraints.NotBlank;
import org.libreccm.l10n.LocalizedString;
import org.libreccm.portation.Portable;
@ -46,7 +49,6 @@ import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlRootElement;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collections;
@ -55,8 +57,6 @@ import java.util.List;
import java.util.Objects;
import java.util.Set;
import org.hibernate.search.annotations.Field;
import static org.libreccm.core.CoreConstants.CORE_XML_NS;
import static org.libreccm.core.CoreConstants.DB_SCHEMA;
@ -134,6 +134,9 @@ import static org.libreccm.core.CoreConstants.DB_SCHEMA;
@XmlRootElement(name = "role", namespace = CORE_XML_NS)
@XmlAccessorType(XmlAccessType.FIELD)
@SuppressWarnings({"PMD.ShortClassName", "PMD.TooManyMethods"})
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class,
resolver = RoleIdResolver.class,
property = "name")
public class Role implements Serializable, Portable {
private static final long serialVersionUID = -7121296514181469687L;
@ -160,13 +163,27 @@ public class Role implements Serializable, Portable {
@XmlElement(name = "name", namespace = CORE_XML_NS)
private String name;
/**
* An optional description for a role.
*/
@Embedded
@AssociationOverride(
name = "values",
joinTable = @JoinTable(name = "ROLE_DESCRIPTIONS",
schema = DB_SCHEMA,
joinColumns = {
@JoinColumn(name = "ROLE_ID")
}))
@XmlElement(name = "description", namespace = CORE_XML_NS)
private LocalizedString description = new LocalizedString();
/**
* All memberships of the roles.
*/
@OneToMany(mappedBy = "role")
@XmlElementWrapper(name = "role-memberships", namespace = CORE_XML_NS)
@XmlElement(name = "role-membership", namespace = CORE_XML_NS)
@JsonManagedReference(value = "role-rolemembership")
@JsonIgnore
private Set<RoleMembership> memberships = new HashSet<>();
/**
@ -175,27 +192,13 @@ public class Role implements Serializable, Portable {
@OneToMany(mappedBy = "grantee")
@XmlElementWrapper(name = "permissions", namespace = CORE_XML_NS)
@XmlElement(name = "permission", namespace = CORE_XML_NS)
@JsonManagedReference(value = "role-permission")
@JsonIgnore
private List<Permission> permissions = new ArrayList<>();
@OneToMany(mappedBy = "role")
@JsonManagedReference(value = "role-taskassignment")
@JsonIgnore
private List<TaskAssignment> assignedTasks = new ArrayList<>();
/**
* An optional description for a role.
*/
@Embedded
@AssociationOverride(
name = "values",
joinTable = @JoinTable(name = "ROLE_DESCRIPTIONS",
schema = DB_SCHEMA,
joinColumns = {
@JoinColumn(name = "ROLE_ID")
}))
@XmlElement(name = "description", namespace = CORE_XML_NS)
private LocalizedString description = new LocalizedString();
public Role() {
super();
}

View File

@ -0,0 +1,52 @@
/*
* Copyright (C) 2015 LibreCCM Foundation.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301 USA
*/
package org.libreccm.security;
import com.fasterxml.jackson.annotation.ObjectIdGenerator;
import com.fasterxml.jackson.annotation.ObjectIdResolver;
/**
* @author <a href="mailto:tosmers@uni-bremen.de>Tobias Osmers</a>
* @version created on 3/23/17
*/
public class RoleIdResolver implements ObjectIdResolver {
@Override
public void bindItem(final ObjectIdGenerator.IdKey id,
final Object pojo) {
// According to the Jackson JavaDoc, this method can be used to keep
// track of objects directly in a resolver implementation. We don't need
// this here therefore this method is empty.
}
@Override
public Object resolveId(final ObjectIdGenerator.IdKey id) {
// Find the user for the id (don't confuse that with the primary key!).
return null;
}
@Override
public ObjectIdResolver newForDeserialization(final Object context) {
return new RoleIdResolver();
}
@Override
public boolean canUseFor(final ObjectIdResolver resolverType) {
return resolverType instanceof RoleIdResolver;
}
}

View File

@ -18,8 +18,8 @@
*/
package org.libreccm.security;
import com.fasterxml.jackson.annotation.JsonBackReference;
import com.fasterxml.jackson.annotation.JsonManagedReference;
import com.fasterxml.jackson.annotation.JsonIdentityInfo;
import com.fasterxml.jackson.annotation.JsonIdentityReference;
import org.libreccm.portation.Portable;
import javax.persistence.Column;
@ -55,6 +55,8 @@ import static org.libreccm.core.CoreConstants.DB_SCHEMA;
+ "WHERE m.member = :member AND m.role = :role")
})
@XmlRootElement(name = "role-membership", namespace = CORE_XML_NS)
@JsonIdentityInfo(generator = RoleMembershipIdGenerator.class,
property = "customMemId")
public class RoleMembership implements Serializable, Portable {
private static final long serialVersionUID = -3049727720697964793L;
@ -68,13 +70,13 @@ public class RoleMembership implements Serializable, Portable {
@ManyToOne
@JoinColumn(name = "ROLE_ID")
@XmlTransient
@JsonBackReference(value = "role-rolemembership")
@JsonIdentityReference(alwaysAsId = true)
private Role role;
@ManyToOne
@JoinColumn(name = "MEMBER_ID")
@XmlTransient
@JsonBackReference(value = "party-rolemembership")
@JsonIdentityReference(alwaysAsId = true)
private Party member;
public long getMembershipId() {

View File

@ -0,0 +1,69 @@
/*
* Copyright (C) 2015 LibreCCM Foundation.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301 USA
*/
package org.libreccm.security;
import com.fasterxml.jackson.annotation.ObjectIdGenerator;
/**
* @author <a href="mailto:tosmers@uni-bremen.de>Tobias Osmers</a>
* @version created on 3/23/17
*/
public class RoleMembershipIdGenerator extends ObjectIdGenerator<String> {
@Override
public Class<?> getScope() {
return RoleMembership.class;
}
@Override
public boolean canUseFor(final ObjectIdGenerator<?> gen) {
return gen instanceof RoleMembershipIdGenerator;
}
@Override
public ObjectIdGenerator<String> forScope(final Class<?> scope) {
return this;
}
@Override
public ObjectIdGenerator<String> newForSerialization(final Object context) {
return this;
}
@Override
public IdKey key(final Object key) {
if (key == null) {
return null;
}
return new IdKey(RoleMembership.class, RoleMembership.class, key);
}
@Override
public String generateId(final Object forPojo) {
if (!(forPojo instanceof RoleMembership)) {
throw new IllegalArgumentException(
"Only RoleMembership instances are supported.");
}
final RoleMembership membership = (RoleMembership) forPojo;
return String.format("{%s}{%s}",
membership.getRole().getName(),
membership.getMember().getName());
}
}

View File

@ -59,9 +59,6 @@ public class RoleMembershipMarshaller extends AbstractMarshaller<RoleMembership>
final RoleMembership roleMembership = save(portableObject);
LOGGER.debug("Saved RoleMembership with id {}.",
roleMembership.getMembershipId());
// } else {
// entityManager.merge(portableObject);
// }
}
@Transactional(Transactional.TxType.REQUIRES_NEW)

View File

@ -18,7 +18,10 @@
*/
package org.libreccm.security;
import com.fasterxml.jackson.annotation.JsonIdentityInfo;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonManagedReference;
import com.fasterxml.jackson.annotation.ObjectIdGenerators;
import org.libreccm.core.EmailAddress;
import org.libreccm.portation.Portable;
@ -46,7 +49,6 @@ import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlTransient;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collections;
@ -126,6 +128,9 @@ import static org.libreccm.core.CoreConstants.DB_SCHEMA;
//Supressing a few warnings from PMD because they misleading here.
//User is perfectly fine class name, and the complexity is not to high...
@SuppressWarnings({"PMD.ShortClassName", "PMD.LongVariable"})
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class,
resolver = UserIdResolver.class,
property = "name")
public class User extends Party implements Serializable, Portable {
private static final long serialVersionUID = 4035223413596611393L;
@ -203,7 +208,7 @@ public class User extends Party implements Serializable, Portable {
@OneToMany(mappedBy = "member")
@XmlElementWrapper(name = "group-memberships", namespace = CORE_XML_NS)
@XmlElement(name = "group-membership", namespace = CORE_XML_NS)
@JsonManagedReference(value = "user-groupmembership")
@JsonIgnore
private Set<GroupMembership> groupMemberships = new HashSet<>();
protected User() {

View File

@ -0,0 +1,52 @@
/*
* Copyright (C) 2015 LibreCCM Foundation.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301 USA
*/
package org.libreccm.security;
import com.fasterxml.jackson.annotation.ObjectIdGenerator;
import com.fasterxml.jackson.annotation.ObjectIdResolver;
/**
* @author <a href="mailto:tosmers@uni-bremen.de>Tobias Osmers</a>
* @version created on 3/23/17
*/
public class UserIdResolver implements ObjectIdResolver {
@Override
public void bindItem(final ObjectIdGenerator.IdKey id,
final Object pojo) {
// According to the Jackson JavaDoc, this method can be used to keep
// track of objects directly in a resolver implementation. We don't need
// this here therefore this method is empty.
}
@Override
public Object resolveId(final ObjectIdGenerator.IdKey id) {
// Find the user for the id (don't confuse that with the primary key!).
return null;
}
@Override
public ObjectIdResolver newForDeserialization(final Object context) {
return new UserIdResolver();
}
@Override
public boolean canUseFor(final ObjectIdResolver resolverType) {
return resolverType instanceof UserIdResolver;
}
}

View File

@ -18,8 +18,9 @@
*/
package org.libreccm.workflow;
import com.fasterxml.jackson.annotation.JsonBackReference;
import com.fasterxml.jackson.annotation.JsonManagedReference;
import com.fasterxml.jackson.annotation.JsonIdentityInfo;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.ObjectIdGenerators;
import org.libreccm.portation.Portable;
import org.libreccm.security.User;
@ -81,6 +82,9 @@ import static org.libreccm.core.CoreConstants.DB_SCHEMA;
@SuppressWarnings({"PMD.CyclomaticComplexity",
"PMD.StdCyclomaticComplexity",
"PMD.ModifiedCyclomaticComplexity"})
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class,
resolver = AssignableTaskIdResolver.class,
property = "uuid")
public class AssignableTask extends Task implements Serializable, Portable {
private static final long serialVersionUID = 4188064584389893019L;
@ -130,7 +134,7 @@ public class AssignableTask extends Task implements Serializable, Portable {
* The roles to which task is assigned.
*/
@OneToMany(mappedBy = "task")
@JsonManagedReference(value = "assignabletask-taskassignment")
@JsonIgnore
private List<TaskAssignment> assignments;
public AssignableTask() {

View File

@ -0,0 +1,52 @@
/*
* Copyright (C) 2015 LibreCCM Foundation.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301 USA
*/
package org.libreccm.workflow;
import com.fasterxml.jackson.annotation.ObjectIdGenerator;
import com.fasterxml.jackson.annotation.ObjectIdResolver;
/**
* @author <a href="mailto:tosmers@uni-bremen.de>Tobias Osmers</a>
* @version created on 3/23/17
*/
public class AssignableTaskIdResolver implements ObjectIdResolver {
@Override
public void bindItem(final ObjectIdGenerator.IdKey id,
final Object pojo) {
// According to the Jackson JavaDoc, this method can be used to keep
// track of objects directly in a resolver implementation. We don't need
// this here therefore this method is empty.
}
@Override
public Object resolveId(final ObjectIdGenerator.IdKey id) {
// Find the user for the id (don't confuse that with the primary key!).
return null;
}
@Override
public ObjectIdResolver newForDeserialization(final Object context) {
return new AssignableTaskIdResolver();
}
@Override
public boolean canUseFor(final ObjectIdResolver resolverType) {
return resolverType instanceof AssignableTaskIdResolver;
}
}

View File

@ -18,8 +18,9 @@
*/
package org.libreccm.workflow;
import com.fasterxml.jackson.annotation.JsonBackReference;
import com.fasterxml.jackson.annotation.JsonIdentityInfo;
import com.fasterxml.jackson.annotation.JsonIdentityReference;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.ObjectIdGenerators;
import org.libreccm.core.CcmObject;
import org.libreccm.core.Identifiable;
@ -98,6 +99,9 @@ import static org.libreccm.core.CoreConstants.DB_SCHEMA;
+ "WHERE t.workflow = :workflow "
+ "AND t.taskState = org.libreccm.workflow.TaskState.FINISHED")
})
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class,
resolver = TaskIdResolver.class,
property = "uuid")
public class Task implements Identifiable, Serializable {
private static final long serialVersionUID = 8161343036908150426L;
@ -159,16 +163,14 @@ public class Task implements Identifiable, Serializable {
*/
@ManyToOne
@JoinColumn(name = "WORKFLOW_ID")
@JsonBackReference(value = "workflow-task")
@JsonIdentityReference(alwaysAsId = true)
private Workflow workflow;
/**
* Tasks which the depends of this task.
*/
@ManyToMany(mappedBy = "dependsOn")
@JsonIdentityInfo(
generator = ObjectIdGenerators.PropertyGenerator.class,
property = "taskId")
@JsonIgnore
private List<Task> dependentTasks;
/**
@ -181,9 +183,7 @@ public class Task implements Identifiable, Serializable {
@JoinColumn(name = "DEPENDS_ON_TASK_ID")},
inverseJoinColumns = {
@JoinColumn(name = "DEPENDENT_TASK_ID")})
@JsonIdentityInfo(
generator = ObjectIdGenerators.PropertyGenerator.class,
property = "taskId")
@JsonIdentityReference(alwaysAsId = true)
private List<Task> dependsOn;
/**

View File

@ -18,8 +18,8 @@
*/
package org.libreccm.workflow;
import com.fasterxml.jackson.annotation.JsonBackReference;
import com.fasterxml.jackson.annotation.JsonManagedReference;
import com.fasterxml.jackson.annotation.JsonIdentityInfo;
import com.fasterxml.jackson.annotation.JsonIdentityReference;
import org.libreccm.portation.Portable;
import org.libreccm.security.Role;
@ -43,6 +43,8 @@ import static org.libreccm.core.CoreConstants.DB_SCHEMA;
*/
@Entity
@Table(name = "WORKFLOW_TASK_ASSIGNMENTS", schema = DB_SCHEMA)
@JsonIdentityInfo(generator = TaskAssignmentIdGenerator.class,
property = "customAssignId")
public class TaskAssignment implements Serializable, Portable {
private static final long serialVersionUID = -4427537363301565707L;
@ -60,7 +62,7 @@ public class TaskAssignment implements Serializable, Portable {
*/
@ManyToOne
@JoinColumn(name = "TASK_ID")
@JsonBackReference(value = "assignabletask-taskassignment")
@JsonIdentityReference(alwaysAsId = true)
private AssignableTask task;
/**
@ -68,7 +70,7 @@ public class TaskAssignment implements Serializable, Portable {
*/
@ManyToOne
@JoinColumn(name = "ROLE_ID")
@JsonBackReference(value = "role-taskassignment")
@JsonIdentityReference(alwaysAsId = true)
private Role role;
public long getTaskAssignmentId() {

View File

@ -0,0 +1,69 @@
/*
* Copyright (C) 2015 LibreCCM Foundation.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301 USA
*/
package org.libreccm.workflow;
import com.fasterxml.jackson.annotation.ObjectIdGenerator;
/**
* @author <a href="mailto:tosmers@uni-bremen.de>Tobias Osmers</a>
* @version created on 3/23/17
*/
public class TaskAssignmentIdGenerator extends ObjectIdGenerator<String> {
@Override
public Class<?> getScope() {
return TaskAssignment.class;
}
@Override
public boolean canUseFor(final ObjectIdGenerator<?> gen) {
return gen instanceof TaskAssignmentIdGenerator;
}
@Override
public ObjectIdGenerator<String> forScope(final Class<?> scope) {
return this;
}
@Override
public ObjectIdGenerator<String> newForSerialization(final Object context) {
return this;
}
@Override
public IdKey key(final Object key) {
if (key == null) {
return null;
}
return new IdKey(TaskAssignment.class, TaskAssignment.class, key);
}
@Override
public String generateId(final Object forPojo) {
if (!(forPojo instanceof TaskAssignment)) {
throw new IllegalArgumentException(
"Only RoleMembership instances are supported.");
}
final TaskAssignment assignment = (TaskAssignment) forPojo;
return String.format("{%s}{%s}",
assignment.getTask().getUuid(),
assignment.getRole().getName());
}
}

View File

@ -0,0 +1,52 @@
/*
* Copyright (C) 2015 LibreCCM Foundation.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301 USA
*/
package org.libreccm.workflow;
import com.fasterxml.jackson.annotation.ObjectIdGenerator;
import com.fasterxml.jackson.annotation.ObjectIdResolver;
/**
* @author <a href="mailto:tosmers@uni-bremen.de>Tobias Osmers</a>
* @version created on 3/23/17
*/
public class TaskIdResolver implements ObjectIdResolver {
@Override
public void bindItem(final ObjectIdGenerator.IdKey id,
final Object pojo) {
// According to the Jackson JavaDoc, this method can be used to keep
// track of objects directly in a resolver implementation. We don't need
// this here therefore this method is empty.
}
@Override
public Object resolveId(final ObjectIdGenerator.IdKey id) {
// Find the user for the id (don't confuse that with the primary key!).
return null;
}
@Override
public ObjectIdResolver newForDeserialization(final Object context) {
return new TaskIdResolver();
}
@Override
public boolean canUseFor(final ObjectIdResolver resolverType) {
return resolverType instanceof TaskIdResolver;
}
}

View File

@ -18,18 +18,13 @@
*/
package org.libreccm.workflow;
import static org.libreccm.core.CoreConstants.*;
import com.fasterxml.jackson.annotation.JsonBackReference;
import com.fasterxml.jackson.annotation.JsonManagedReference;
import com.fasterxml.jackson.annotation.JsonIdentityInfo;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.ObjectIdGenerators;
import org.libreccm.core.CcmObject;
import org.libreccm.core.Identifiable;
import org.libreccm.l10n.LocalizedString;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Objects;
import org.libreccm.portation.Portable;
import javax.persistence.AssociationOverride;
import javax.persistence.Column;
@ -51,8 +46,13 @@ import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.Table;
import javax.validation.constraints.NotNull;
import org.libreccm.core.Identifiable;
import org.libreccm.portation.Portable;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Objects;
import static org.libreccm.core.CoreConstants.DB_SCHEMA;
/**
* A workflow is a collection of tasks which are performed on an object. Tasks
@ -73,6 +73,9 @@ import org.libreccm.portation.Portable;
query = "SELECT w FROM Workflow w "
+ "WHERE W.object = :object")
})
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class,
resolver = WorkflowIdResolver.class,
property = "uuid")
public class Workflow implements Identifiable, Serializable, Portable {
private static final long serialVersionUID = 4322500264543325829L;
@ -157,7 +160,7 @@ public class Workflow implements Identifiable, Serializable, Portable {
* The tasks belonging to this workflow.
*/
@OneToMany(mappedBy = "workflow")
@JsonManagedReference(value = "workflow-task")
@JsonIgnore
private List<Task> tasks;
public Workflow() {

View File

@ -0,0 +1,52 @@
/*
* Copyright (C) 2015 LibreCCM Foundation.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301 USA
*/
package org.libreccm.workflow;
import com.fasterxml.jackson.annotation.ObjectIdGenerator;
import com.fasterxml.jackson.annotation.ObjectIdResolver;
/**
* @author <a href="mailto:tosmers@uni-bremen.de>Tobias Osmers</a>
* @version created on 3/23/17
*/
public class WorkflowIdResolver implements ObjectIdResolver {
@Override
public void bindItem(final ObjectIdGenerator.IdKey id,
final Object pojo) {
// According to the Jackson JavaDoc, this method can be used to keep
// track of objects directly in a resolver implementation. We don't need
// this here therefore this method is empty.
}
@Override
public Object resolveId(final ObjectIdGenerator.IdKey id) {
// Find the user for the id (don't confuse that with the primary key!).
return null;
}
@Override
public ObjectIdResolver newForDeserialization(final Object context) {
return new WorkflowIdResolver();
}
@Override
public boolean canUseFor(final ObjectIdResolver resolverType) {
return resolverType instanceof WorkflowIdResolver;
}
}

View File

@ -24,6 +24,7 @@ import org.jboss.arquillian.junit.InSequence;
import org.jboss.arquillian.persistence.CleanupUsingScript;
import org.jboss.arquillian.persistence.CreateSchema;
import org.jboss.arquillian.persistence.PersistenceTest;
import org.jboss.arquillian.persistence.TestExecutionPhase;
import org.jboss.arquillian.transaction.api.annotation.TransactionMode;
import org.jboss.arquillian.transaction.api.annotation.Transactional;
import org.jboss.shrinkwrap.api.ShrinkWrap;
@ -39,9 +40,7 @@ import org.junit.experimental.categories.Category;
import org.junit.runner.RunWith;
import org.libreccm.tests.categories.IntegrationTest;
import javax.faces.bean.RequestScoped;
import javax.inject.Inject;
import org.jboss.arquillian.persistence.TestExecutionPhase;
import static org.libreccm.testutils.DependenciesHelpers.getModuleDependencies;
@ -127,79 +126,75 @@ public class CoreDataImportTest {
// TEST SECTION
@Test
@InSequence(105)
public void categoriesShouldBeImported() {
@InSequence(115)
public void roleMembershipsShouldBeImported() {
Assert.assertFalse(importHelper.importRoleMemberships());
}
//@Test
@Test
@InSequence(110)
public void categorizationsShouldBeImported() {
importHelper.importGroupMemberships();
public void groupMembershipsShouldBeImported() {
Assert.assertFalse(importHelper.importGroupMemberships());
}
//@Test
@Test
@InSequence(115)
public void usersShouldBeImported() {
importHelper.importGroups();
public void groupsShouldBeImported() {
Assert.assertFalse(importHelper.importGroups());
}
//@Test
@InSequence(120)
public void groupsShouldBeImported() {
public void usersShouldBeImported() {
importHelper.importUsers();
}
//@Test
@InSequence(125)
public void groupMembershipsShouldBeImported() {
public void taskAssignmentsMembershipsShouldBeImported() {
importHelper.importTaskAssignments();
}
//@Test
@InSequence(130)
public void rolesShouldBeImported() {
public void assignableTasksShouldBeImported() {
importHelper.importAssignableTasks();
}
//@Test
@InSequence(135)
public void roleMembershipsShouldBeImported() {
public void workflowTemplatesShouldBeImported() {
importHelper.importWorkflowTemplates();
}
//@Test
@InSequence(140)
public void workflowTemplatesShouldBeImported() {
public void workflowsShouldBeImported() {
importHelper.importWorkflows();
}
//@Test
@InSequence(145)
public void workflowsShouldBeImported() {
public void categorizationsShouldBeImported() {
importHelper.importCategorizations();
}
//@Test
@InSequence(150)
public void assignableTasksShouldBeImported() {
public void PermissionsShouldBeImported() {
importHelper.importPermissions();
}
//@Test
@InSequence(155)
public void taskAssignmentsShouldBeImported() {
public void categoriesShouldBeImported() {
importHelper.importCategories();
}
//@Test
@InSequence(160)
public void permissionsShouldBeImported() {
public void rolesShouldBeImported() {
importHelper.importRoles();
}
}

View File

@ -55,8 +55,8 @@ import javax.inject.Inject;
*/
@RequestScoped
class ImportHelper {
private String repoPath = "/home/jensp/pwi/libreccm/ccm/";
//private String repoPath = "";
//private String repoPath = "/home/jensp/pwi/libreccm/ccm/";
private String repoPath = "/home/tosmers/Svn/libreccm/";
private String projectPath = "ccm_ng/ccm-core/src/test/resources/" +
"portation/trunk-iaw-exports";
private boolean indentation = false;
@ -99,40 +99,40 @@ class ImportHelper {
private PermissionMarshaller permissionMarshaller;
void importCategories() {
boolean importCategories() {
categoryMarshaller.prepare(Format.XML, repoPath + projectPath,
"categories.xml", indentation);
categoryMarshaller.importFile();
return categoryMarshaller.importFile();
}
void importCategorizations() {
boolean importCategorizations() {
categorizationMarshaller.prepare(Format.XML, repoPath + projectPath,
"categorizations.xml", indentation);
categorizationMarshaller.importFile();
return categorizationMarshaller.importFile();
}
void importUsers() {
boolean importUsers() {
userMarshaller.prepare(Format.XML, repoPath + projectPath,
"users.xml", indentation);
userMarshaller.importFile();
return userMarshaller.importFile();
}
void importGroups() {
boolean importGroups() {
groupMarshaller.prepare(Format.XML, repoPath + projectPath,
"groups.xml", indentation);
groupMarshaller.importFile();
return groupMarshaller.importFile();
}
void importGroupMemberships() {
boolean importGroupMemberships() {
groupMembershipMarshaller.prepare(Format.XML, repoPath + projectPath,
"groupMemberships.xml", indentation);
groupMembershipMarshaller.importFile();
return groupMembershipMarshaller.importFile();
}
void importRoles() {
boolean importRoles() {
roleMarshaller.prepare(Format.XML, repoPath + projectPath,
"roles.xml", indentation);
roleMarshaller.importFile();
return roleMarshaller.importFile();
}
boolean importRoleMemberships() {
@ -141,34 +141,34 @@ class ImportHelper {
return roleMembershipMarshaller.importFile();
}
void importWorkflowTemplates() {
boolean importWorkflowTemplates() {
workflowTemplateMarshaller.prepare(Format.XML, repoPath + projectPath,
"workflowTemplates.xml", indentation);
workflowTemplateMarshaller.importFile();
return workflowTemplateMarshaller.importFile();
}
void importWorkflows() {
boolean importWorkflows() {
workflowMarshaller.prepare(Format.XML, repoPath + projectPath,
"workflows.xml", indentation);
workflowMarshaller.importFile();
return workflowMarshaller.importFile();
}
void importAssignableTasks() {
boolean importAssignableTasks() {
assignableTaskMarshaller.prepare(Format.XML, repoPath + projectPath,
"assignableTasks.xml", indentation);
assignableTaskMarshaller.importFile();
return assignableTaskMarshaller.importFile();
}
void importTaskAssignments() {
boolean importTaskAssignments() {
taskAssignmentMarshaller.prepare(Format.XML, repoPath + projectPath,
"taskAssignments.xml", indentation);
taskAssignmentMarshaller.importFile();
return taskAssignmentMarshaller.importFile();
}
void importPermissions() {
boolean importPermissions() {
permissionMarshaller.prepare(Format.XML, repoPath + projectPath,
"permissions.xml", indentation);
permissionMarshaller.importFile();
return permissionMarshaller.importFile();
}
}

View File

@ -1 +0,0 @@
2360d180c42c314f7e0193dc2cba611e2fca0331

File diff suppressed because one or more lines are too long

View File

@ -1,8 +1,8 @@
<GroupMembership><membershipId>1</membershipId></GroupMembership>
<GroupMembership><membershipId>2</membershipId></GroupMembership>
<GroupMembership><membershipId>3</membershipId></GroupMembership>
<GroupMembership><membershipId>4</membershipId></GroupMembership>
<GroupMembership><membershipId>5</membershipId></GroupMembership>
<GroupMembership><membershipId>6</membershipId></GroupMembership>
<GroupMembership><membershipId>7</membershipId></GroupMembership>
<GroupMembership><membershipId>8</membershipId></GroupMembership>
<GroupMembership><customMemId>{Site-wide Administrators}{Ariela Trümper}</customMemId><membershipId>7135036</membershipId><group>Site-wide Administrators</group><member>Ariela Trümper</member></GroupMembership>
<GroupMembership><customMemId>{Site-wide Administrators}{Hartmut Schekerka}</customMemId><membershipId>7135037</membershipId><group>Site-wide Administrators</group><member>Hartmut Schekerka</member></GroupMembership>
<GroupMembership><customMemId>{content Administration}{Hartmut Schekerka}</customMemId><membershipId>7135038</membershipId><group>content Administration</group><member>Hartmut Schekerka</member></GroupMembership>
<GroupMembership><customMemId>{Portal Homepage}{Public Users}</customMemId><membershipId>7135039</membershipId><group>Portal Homepage</group><member>Public Users</member></GroupMembership>
<GroupMembership><customMemId>{Site-wide Administrators}{Nessim Hemmer}</customMemId><membershipId>7135033</membershipId><group>Site-wide Administrators</group><member>Nessim Hemmer</member></GroupMembership>
<GroupMembership><customMemId>{Site-wide Administrators}{Peter Boy}</customMemId><membershipId>7135034</membershipId><group>Site-wide Administrators</group><member>Peter Boy</member></GroupMembership>
<GroupMembership><customMemId>{Site-wide Administrators}{Jörg Sommer}</customMemId><membershipId>7135035</membershipId><group>Site-wide Administrators</group><member>Jörg Sommer</member></GroupMembership>
<GroupMembership><customMemId>{projects Administration}{Hartmut Schekerka}</customMemId><membershipId>7135040</membershipId><group>projects Administration</group><member>Hartmut Schekerka</member></GroupMembership>

View File

@ -1,16 +1,16 @@
<Group><partyId>541003</partyId><name>projects Administration</name><memberships><membershipId>8</membershipId></memberships></Group>
<Group><partyId>1061</partyId><name>content Administration</name><memberships><membershipId>6</membershipId></memberships></Group>
<Group><partyId>541006</partyId><name>projects Viewers</name></Group>
<Group><partyId>1064</partyId><name>content Viewers</name></Group>
<Group><partyId>1339004</partyId><name>homepages Viewers</name></Group>
<Group><partyId>3439036</partyId><name>publications Viewers</name></Group>
<Group><partyId>5619069</partyId><name>euss Administration</name></Group>
<Group><partyId>-300</partyId><name>Site-wide Administrators</name><roleMemberships><membershipId>157</membershipId></roleMemberships><roleMemberships><membershipId>152</membershipId></roleMemberships><roleMemberships><membershipId>130</membershipId></roleMemberships><roleMemberships><membershipId>153</membershipId></roleMemberships><roleMemberships><membershipId>123</membershipId></roleMemberships><roleMemberships><membershipId>136</membershipId></roleMemberships><roleMemberships><membershipId>158</membershipId></roleMemberships><roleMemberships><membershipId>109</membershipId></roleMemberships><roleMemberships><membershipId>154</membershipId></roleMemberships><roleMemberships><membershipId>112</membershipId></roleMemberships><roleMemberships><membershipId>116</membershipId></roleMemberships><roleMemberships><membershipId>140</membershipId></roleMemberships><memberships><membershipId>1</membershipId></memberships><memberships><membershipId>2</membershipId></memberships><memberships><membershipId>3</membershipId></memberships><memberships><membershipId>4</membershipId></memberships><memberships><membershipId>5</membershipId></memberships></Group>
<Group><partyId>5619070</partyId><name>euss Viewers</name></Group>
<Group><partyId>1339003</partyId><name>homepages Administration</name></Group>
<Group><partyId>3439035</partyId><name>publications Administration</name></Group>
<Group><partyId>1937037</partyId><name>research Viewers</name></Group>
<Group><partyId>1937036</partyId><name>research Administration</name></Group>
<Group><partyId>1271</partyId><name>Portal Workspace Groups</name></Group>
<Group><partyId>1274</partyId><name>Portal Homepage</name></Group>
<Group><partyId>1278</partyId><name>Portal Homepage</name><memberships><membershipId>7</membershipId></memberships></Group>
<Group><name>projects Administration</name><partyId>541003</partyId></Group>
<Group><name>content Administration</name><partyId>1061</partyId></Group>
<Group><name>projects Viewers</name><partyId>541006</partyId></Group>
<Group><name>content Viewers</name><partyId>1064</partyId></Group>
<Group><name>homepages Viewers</name><partyId>1339004</partyId></Group>
<Group><name>publications Viewers</name><partyId>3439036</partyId></Group>
<Group><name>euss Administration</name><partyId>5619069</partyId></Group>
<Group><name>Site-wide Administrators</name><partyId>-300</partyId></Group>
<Group><name>euss Viewers</name><partyId>5619070</partyId></Group>
<Group><name>homepages Administration</name><partyId>1339003</partyId></Group>
<Group><name>publications Administration</name><partyId>3439035</partyId></Group>
<Group><name>research Viewers</name><partyId>1937037</partyId></Group>
<Group><name>research Administration</name><partyId>1937036</partyId></Group>
<Group><name>Portal Workspace Groups</name><partyId>1271</partyId></Group>
<Group><name>Portal Homepage</name><partyId>1274</partyId></Group>
<Group><name>Portal Homepage</name><partyId>1278</partyId></Group>

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

View File

@ -1 +0,0 @@
59e0c387f48646fc317fdde9b796a6012593480b