CCM NG/ccm-cms: Additional fields for content item to provide easier access to auditing data.

git-svn-id: https://svn.libreccm.org/ccm/ccm_ng@4586 8810af33-2d31-482b-a856-94f89814c4df
pull/2/head
jensp 2017-02-21 14:20:32 +00:00
parent d821dbe5d7
commit faa27466bf
8 changed files with 312 additions and 158 deletions

View File

@ -50,15 +50,12 @@ import javax.annotation.PostConstruct;
import javax.enterprise.context.RequestScoped; import javax.enterprise.context.RequestScoped;
import javax.inject.Inject; import javax.inject.Inject;
import javax.persistence.EntityManager; import javax.persistence.EntityManager;
import javax.persistence.TypedQuery;
import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Expression;
import javax.persistence.criteria.Join; import javax.persistence.criteria.Join;
import javax.persistence.criteria.Order;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root; import javax.persistence.criteria.Root;
import javax.transaction.Transactional; import javax.transaction.Transactional;
import org.hibernate.envers.AuditReader;
/** /**
* *
@ -68,11 +65,14 @@ import javax.transaction.Transactional;
public class FolderBrowserController { public class FolderBrowserController {
private static final Logger LOGGER = LogManager.getLogger( private static final Logger LOGGER = LogManager.getLogger(
FolderBrowserController.class); FolderBrowserController.class);
@Inject @Inject
private EntityManager entityManager; private EntityManager entityManager;
@Inject
private AuditReader auditReader;
@Inject @Inject
private CcmObjectRepository objectRepo; private CcmObjectRepository objectRepo;
@ -93,7 +93,7 @@ public class FolderBrowserController {
@PostConstruct @PostConstruct
private void init() { private void init() {
final KernelConfig kernelConfig = confManager.findConfiguration( final KernelConfig kernelConfig = confManager.findConfiguration(
KernelConfig.class); KernelConfig.class);
defaultLocale = kernelConfig.getDefaultLocale(); defaultLocale = kernelConfig.getDefaultLocale();
} }
@ -126,19 +126,19 @@ public class FolderBrowserController {
final CriteriaBuilder builder = entityManager.getCriteriaBuilder(); final CriteriaBuilder builder = entityManager.getCriteriaBuilder();
final CriteriaQuery<CcmObject> criteriaQuery = builder final CriteriaQuery<CcmObject> criteriaQuery = builder
.createQuery(CcmObject.class); .createQuery(CcmObject.class);
final Root<CcmObject> from = criteriaQuery.from(CcmObject.class); final Root<CcmObject> from = criteriaQuery.from(CcmObject.class);
return entityManager.createQuery( return entityManager.createQuery(
criteriaQuery criteriaQuery
.select(from) .select(from)
.where(builder.or( .where(builder.or(
from.in(findSubFolders(folder, filterTerm)), from.in(findSubFolders(folder, filterTerm)),
from.in(findItemsInFolder(folder, filterTerm)))) from.in(findItemsInFolder(folder, filterTerm))))
.orderBy(builder.asc(from.get("displayName")))) .orderBy(builder.asc(from.get("displayName"))))
.setFirstResult(first) .setFirstResult(first)
.setMaxResults(maxResults) .setMaxResults(maxResults)
.getResultList(); .getResultList();
} }
public long countObjects(final Folder folder) { public long countObjects(final Folder folder) {
@ -150,17 +150,19 @@ public class FolderBrowserController {
final CriteriaBuilder builder = entityManager.getCriteriaBuilder(); final CriteriaBuilder builder = entityManager.getCriteriaBuilder();
final CriteriaQuery<Long> criteriaQuery = builder.createQuery( final CriteriaQuery<Long> criteriaQuery = builder.createQuery(
Long.class); Long.class);
final Root<CcmObject> from = criteriaQuery.from(CcmObject.class); final Root<CcmObject> from = criteriaQuery.from(CcmObject.class);
return entityManager return entityManager
.createQuery( .createQuery(
criteriaQuery criteriaQuery
.select(builder.count(from)) .select(builder.count(from))
.where(builder.or( .where(builder.or(
from.in(findSubFolders(folder, filterTerm)), from.in(findSubFolders(folder,
from.in(findItemsInFolder(folder, filterTerm))))) filterTerm)),
.getSingleResult(); from.in(findItemsInFolder(folder,
filterTerm))))).
getSingleResult();
} }
@Transactional(Transactional.TxType.REQUIRED) @Transactional(Transactional.TxType.REQUIRED)
@ -169,8 +171,8 @@ public class FolderBrowserController {
final List<CcmObject> objects = findObjects(folder, orderBy); final List<CcmObject> objects = findObjects(folder, orderBy);
return objects.stream() return objects.stream()
.map(object -> buildRow(object)) .map(object -> buildRow(object))
.collect(Collectors.toList()); .collect(Collectors.toList());
} }
@Transactional(Transactional.TxType.REQUIRED) @Transactional(Transactional.TxType.REQUIRED)
@ -182,8 +184,8 @@ public class FolderBrowserController {
orderBy); orderBy);
return objects.stream() return objects.stream()
.map(object -> buildRow(object)) .map(object -> buildRow(object))
.collect(Collectors.toList()); .collect(Collectors.toList());
} }
@Transactional(Transactional.TxType.REQUIRED) @Transactional(Transactional.TxType.REQUIRED)
@ -191,14 +193,14 @@ public class FolderBrowserController {
final String orderBy, final String orderBy,
final int first, final int first,
final int maxResults) { final int maxResults) {
final List<CcmObject> objects = findObjects(folder, final List<CcmObject> objects = findObjects(folder,
orderBy, orderBy,
first, first,
maxResults); maxResults);
return objects.stream() return objects.stream()
.map(object -> buildRow(object)) .map(object -> buildRow(object))
.collect(Collectors.toList()); .collect(Collectors.toList());
} }
@Transactional(Transactional.TxType.REQUIRED) @Transactional(Transactional.TxType.REQUIRED)
@ -214,8 +216,8 @@ public class FolderBrowserController {
maxResults); maxResults);
return objects.stream() return objects.stream()
.map(object -> buildRow(object)) .map(object -> buildRow(object))
.collect(Collectors.toList()); .collect(Collectors.toList());
} }
private FolderBrowserTableRow buildRow(final CcmObject object) { private FolderBrowserTableRow buildRow(final CcmObject object) {
@ -228,9 +230,9 @@ public class FolderBrowserController {
row.setName(folder.getName()); row.setName(folder.getName());
row.setLanguages(Collections.emptyList()); row.setLanguages(Collections.emptyList());
if (folder.getTitle().hasValue(globalizationHelper if (folder.getTitle().hasValue(globalizationHelper
.getNegotiatedLocale())) { .getNegotiatedLocale())) {
row.setTitle(folder.getTitle().getValue(globalizationHelper row.setTitle(folder.getTitle().getValue(globalizationHelper
.getNegotiatedLocale())); .getNegotiatedLocale()));
} else { } else {
row.setTitle(folder.getTitle().getValue(defaultLocale)); row.setTitle(folder.getTitle().getValue(defaultLocale));
} }
@ -241,20 +243,20 @@ public class FolderBrowserController {
row.setObjectUuid(item.getItemUuid()); row.setObjectUuid(item.getItemUuid());
row.setName(item.getName().getValue(defaultLocale)); row.setName(item.getName().getValue(defaultLocale));
final List<Locale> languages = new ArrayList<>(itemL10NManager final List<Locale> languages = new ArrayList<>(itemL10NManager
.availableLanguages(item)); .availableLanguages(item));
languages.sort((lang1, lang2) -> lang1.toString().compareTo( languages.sort((lang1, lang2) -> lang1.toString().compareTo(
lang2.toString())); lang2.toString()));
row.setLanguages(languages); row.setLanguages(languages);
if (item.getTitle().hasValue(globalizationHelper if (item.getTitle().hasValue(globalizationHelper
.getNegotiatedLocale())) { .getNegotiatedLocale())) {
row.setTitle(item.getTitle().getValue(globalizationHelper row.setTitle(item.getTitle().getValue(globalizationHelper
.getNegotiatedLocale())); .getNegotiatedLocale()));
} else { } else {
row.setTitle(item.getTitle().getValue(defaultLocale)); row.setTitle(item.getTitle().getValue(defaultLocale));
} }
final ContentType type = item.getContentType(); final ContentType type = item.getContentType();
final ContentTypeInfo typeInfo = typesManager.getContentTypeInfo( final ContentTypeInfo typeInfo = typesManager.getContentTypeInfo(
type); type);
row.setTypeLabelBundle(typeInfo.getLabelBundle()); row.setTypeLabelBundle(typeInfo.getLabelBundle());
row.setTypeLabelKey(typeInfo.getLabelKey()); row.setTypeLabelKey(typeInfo.getLabelKey());
row.setFolder(false); row.setFolder(false);
@ -291,44 +293,45 @@ public class FolderBrowserController {
private List<Folder> findSubFolders(final Folder folder, private List<Folder> findSubFolders(final Folder folder,
final String filterTerm) { final String filterTerm) {
final CriteriaBuilder builder = entityManager final CriteriaBuilder builder = entityManager
.getCriteriaBuilder(); .getCriteriaBuilder();
final CriteriaQuery<Folder> query = builder.createQuery( final CriteriaQuery<Folder> query = builder.createQuery(
Folder.class); Folder.class);
final Root<Folder> from = query.from(Folder.class); final Root<Folder> from = query.from(Folder.class);
return entityManager.createQuery( return entityManager.createQuery(
query.where(builder.and( query.where(builder.and(
builder.equal(from.get("parentCategory"), folder), builder.equal(from.get("parentCategory"), folder),
builder.like(builder.lower(from.get("name")), filterTerm)))) builder.
.getResultList(); like(builder.lower(from.get("name")), filterTerm)))).
getResultList();
} }
private List<ContentItem> findItemsInFolder( private List<ContentItem> findItemsInFolder(
final Folder folder, final Folder folder,
final String filterTerm) { final String filterTerm) {
final CriteriaBuilder builder = entityManager final CriteriaBuilder builder = entityManager
.getCriteriaBuilder(); .getCriteriaBuilder();
final CriteriaQuery<ContentItem> query = builder.createQuery( final CriteriaQuery<ContentItem> query = builder.createQuery(
ContentItem.class); ContentItem.class);
final Root<ContentItem> fromItem = query.from(ContentItem.class); final Root<ContentItem> fromItem = query.from(ContentItem.class);
final Join<ContentItem, Categorization> join = fromItem.join( final Join<ContentItem, Categorization> join = fromItem.join(
"categories"); "categories");
return entityManager.createQuery(query return entityManager.createQuery(query
.select(fromItem) .select(fromItem)
.where(builder.and( .where(builder.and(
builder.equal(join.get("category"), folder), builder.equal(join.get("category"), folder),
builder.equal(join.get("type"), builder.equal(join.get("type"),
CmsConstants.CATEGORIZATION_TYPE_FOLDER), CmsConstants.CATEGORIZATION_TYPE_FOLDER),
builder.equal(fromItem.get("version"), builder.equal(fromItem.get("version"),
ContentItemVersion.DRAFT), ContentItemVersion.DRAFT),
builder.like(fromItem.get("displayName"), builder.like(fromItem.get("displayName"),
filterTerm)))) filterTerm))))
.getResultList(); .getResultList();
} }
} }

View File

@ -56,6 +56,7 @@ import javax.persistence.TemporalType;
import org.hibernate.search.annotations.IndexedEmbedded; import org.hibernate.search.annotations.IndexedEmbedded;
import javax.persistence.FetchType; import javax.persistence.FetchType;
import org.hibernate.envers.NotAudited;
import static org.librecms.CmsConstants.*; import static org.librecms.CmsConstants.*;
@ -70,93 +71,95 @@ import static org.librecms.CmsConstants.*;
//@Indexed //@Indexed
@NamedQueries({ @NamedQueries({
@NamedQuery( @NamedQuery(
name = "ContentItem.findById", name = "ContentItem.findById",
query = "SELECT i FROM ContentItem i " query = "SELECT i FROM ContentItem i "
+ "WHERE i.objectId = :objectId " + "WHERE i.objectId = :objectId "
+ "AND (EXISTS(SELECT p FROM Permission p " + "AND (EXISTS(SELECT p FROM Permission p "
+ "WHERE p.grantedPrivilege = 'read' " + "WHERE p.grantedPrivilege = 'read' "
+ "AND p.grantee IN :roles " + "AND p.grantee IN :roles "
+ "AND p.object = i)" + "AND p.object = i)"
+ "OR true = :admin)") + "OR true = :admin)")
, ,
@NamedQuery( @NamedQuery(
name = "ContentItem.findByType", name = "ContentItem.findByType",
query = "SELECT i FROM ContentItem i WHERE TYPE(i) = :type") query = "SELECT i FROM ContentItem i WHERE TYPE(i) = :type")
, ,
@NamedQuery( @NamedQuery(
name = "ContentItem.findByFolder", name = "ContentItem.findByFolder",
query = "SELECT i FROM ContentItem i " query = "SELECT i FROM ContentItem i "
+ "JOIN i.categories c " + "JOIN i.categories c "
+ "WHERE c.category = :folder " + "WHERE c.category = :folder "
+ "AND c.type = '" + CATEGORIZATION_TYPE_FOLDER + "AND c.type = '" + CATEGORIZATION_TYPE_FOLDER
+ "'") + "'")
, ,
@NamedQuery( @NamedQuery(
name = "ContentItem.countItemsInFolder", name = "ContentItem.countItemsInFolder",
query = "SELECT count(i) FROM ContentItem i " query = "SELECT count(i) FROM ContentItem i "
+ "JOIN i.categories c " + "JOIN i.categories c "
+ "WHERE c.category = :folder " + "WHERE c.category = :folder "
+ "AND c.type = '" + CATEGORIZATION_TYPE_FOLDER + "AND c.type = '" + CATEGORIZATION_TYPE_FOLDER
+ "'") + "'")
, ,
@NamedQuery( @NamedQuery(
name = "ContentItem.findByNameInFolder", name = "ContentItem.findByNameInFolder",
query = "SELECT i FROM ContentItem i " query = "SELECT i FROM ContentItem i "
+ "JOIN i.categories c " + "JOIN i.categories c "
+ "WHERE c.category = :folder " + "WHERE c.category = :folder "
+ "AND c.type = '" + CATEGORIZATION_TYPE_FOLDER + "' " + "AND c.type = '" + CATEGORIZATION_TYPE_FOLDER
+ "AND i.displayName = :name") + "' "
+ "AND i.displayName = :name")
, ,
@NamedQuery( @NamedQuery(
name = "ContentItem.countByNameInFolder", name = "ContentItem.countByNameInFolder",
query = "SELECT COUNT(i) FROM ContentItem i " query = "SELECT COUNT(i) FROM ContentItem i "
+ "JOIN i.categories c " + "JOIN i.categories c "
+ "WHERE c.category = :folder " + "WHERE c.category = :folder "
+ "AND c.type = '" + CATEGORIZATION_TYPE_FOLDER + "' " + "AND c.type = '" + CATEGORIZATION_TYPE_FOLDER
+ "AND i.displayName = :name") + "' "
+ "AND i.displayName = :name")
, ,
@NamedQuery( @NamedQuery(
name = "ContentItem.filterByFolderAndName", name = "ContentItem.filterByFolderAndName",
query = "SELECT i FROM ContentItem i " query = "SELECT i FROM ContentItem i "
+ "JOIN i.categories c " + "JOIN i.categories c "
+ "WHERE c.category = :folder " + "WHERE c.category = :folder "
+ "AND c.type = '" + CATEGORIZATION_TYPE_FOLDER + "AND c.type = '" + CATEGORIZATION_TYPE_FOLDER
+ "' " + "' "
+ "AND LOWER(i.displayName) LIKE CONCAT(LOWER(:name), '%')") + "AND LOWER(i.displayName) LIKE CONCAT(LOWER(:name), '%')")
, ,
@NamedQuery( @NamedQuery(
name = "ContentItem.countFilterByFolderAndName", name = "ContentItem.countFilterByFolderAndName",
query = "SELECT COUNT(i) FROM ContentItem i " query = "SELECT COUNT(i) FROM ContentItem i "
+ "JOIN i.categories c " + "JOIN i.categories c "
+ "WHERE c.category = :folder " + "WHERE c.category = :folder "
+ "AND c.type = '" + CATEGORIZATION_TYPE_FOLDER + "AND c.type = '" + CATEGORIZATION_TYPE_FOLDER
+ "' " + "' "
+ "AND LOWER(i.displayName) LIKE CONCAT(LOWER(:name), '%')" + "AND LOWER(i.displayName) LIKE CONCAT(LOWER(:name), '%')"
) )
, ,
@NamedQuery( @NamedQuery(
name = "ContentItem.hasLiveVersion", name = "ContentItem.hasLiveVersion",
query = "SELECT (CASE WHEN COUNT(i) > 0 THEN true ELSE false END) " query = "SELECT (CASE WHEN COUNT(i) > 0 THEN true ELSE false END) "
+ "FROM ContentItem i " + "FROM ContentItem i "
+ "WHERE i.itemUuid = :uuid " + "WHERE i.itemUuid = :uuid "
+ "AND i.version = org.librecms.contentsection.ContentItemVersion.LIVE") + "AND i.version = org.librecms.contentsection.ContentItemVersion.LIVE")
, ,
@NamedQuery( @NamedQuery(
name = "ContentItem.findDraftVersion", name = "ContentItem.findDraftVersion",
query = "SELECT i FROM ContentItem i " query = "SELECT i FROM ContentItem i "
+ "WHERE i.itemUuid = :uuid " + "WHERE i.itemUuid = :uuid "
+ "AND i.version = org.librecms.contentsection.ContentItemVersion.DRAFT") + "AND i.version = org.librecms.contentsection.ContentItemVersion.DRAFT")
, ,
@NamedQuery( @NamedQuery(
name = "ContentItem.findLiveVersion", name = "ContentItem.findLiveVersion",
query = "SELECT i FROM ContentItem i " query = "SELECT i FROM ContentItem i "
+ "WHERE i.itemUuid = :uuid " + "WHERE i.itemUuid = :uuid "
+ "AND i.version = org.librecms.contentsection.ContentItemVersion.LIVE") + "AND i.version = org.librecms.contentsection.ContentItemVersion.LIVE")
, ,
@NamedQuery( @NamedQuery(
name = "ContentItem.findItemWithWorkflow", name = "ContentItem.findItemWithWorkflow",
query = "SELECT i FROM ContentItem i " query = "SELECT i FROM ContentItem i "
+ "WHERE i.workflow = :workflow" + "WHERE i.workflow = :workflow"
) )
}) })
public class ContentItem extends CcmObject implements Serializable { public class ContentItem extends CcmObject implements Serializable {
@ -175,13 +178,13 @@ public class ContentItem extends CcmObject implements Serializable {
*/ */
@Embedded @Embedded
@AssociationOverride( @AssociationOverride(
name = "values", name = "values",
joinTable = @JoinTable(name = "CONTENT_ITEM_NAMES", joinTable = @JoinTable(name = "CONTENT_ITEM_NAMES",
schema = DB_SCHEMA, schema = DB_SCHEMA,
joinColumns = { joinColumns = {
@JoinColumn(name = "OBJECT_ID") @JoinColumn(name = "OBJECT_ID")
} }
) )
) )
// @Field // @Field
private LocalizedString name; private LocalizedString name;
@ -200,13 +203,13 @@ public class ContentItem extends CcmObject implements Serializable {
*/ */
@Embedded @Embedded
@AssociationOverride( @AssociationOverride(
name = "values", name = "values",
joinTable = @JoinTable(name = "CONTENT_ITEM_TITLES", joinTable = @JoinTable(name = "CONTENT_ITEM_TITLES",
schema = DB_SCHEMA, schema = DB_SCHEMA,
joinColumns = { joinColumns = {
@JoinColumn(name = "OBJECT_ID") @JoinColumn(name = "OBJECT_ID")
} }
) )
) )
@IndexedEmbedded @IndexedEmbedded
private LocalizedString title; private LocalizedString title;
@ -216,12 +219,12 @@ public class ContentItem extends CcmObject implements Serializable {
*/ */
@Embedded @Embedded
@AssociationOverride( @AssociationOverride(
name = "values", name = "values",
joinTable = @JoinTable(name = "CONTENT_ITEM_DESCRIPTIONS", joinTable = @JoinTable(name = "CONTENT_ITEM_DESCRIPTIONS",
schema = DB_SCHEMA, schema = DB_SCHEMA,
joinColumns = { joinColumns = {
@JoinColumn(name = "OBJECT_ID")} @JoinColumn(name = "OBJECT_ID")}
)) ))
@IndexedEmbedded @IndexedEmbedded
private LocalizedString description; private LocalizedString description;
@ -260,6 +263,58 @@ public class ContentItem extends CcmObject implements Serializable {
@Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED) @Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED)
private Workflow workflow; private Workflow workflow;
/**
* Date when the item was created. This information is also available from
* the revision managed by Envers, but getting access to them involves some
* complex queries. Also it is not possible to get the creation date (date
* of the first entity) together with the last modified date (date of the
* last revision/current revision) of the item.
*/
@Column(name = "CREATION_DATE")
@Temporal(TemporalType.TIMESTAMP)
@NotAudited
private Date creationDate;
/**
* Date the item was last modified. This information is also available from
* the revision managed by Envers, but getting access to them involves some
* complex queries. Also it is not possible to get the creation date (date
* of the first entity) together with the last modified date (date of the
* last revision/current revision) of the item.
*/
@Column(name = "LAST_MODIFIED")
@Temporal(TemporalType.TIMESTAMP)
@NotAudited
private Date lastModified;
/**
* The name of the user which created the item. This information is also
* available from the revision managed by Envers, but getting access to them
* involves some complex queries. Also it is not possible to get the
* creation user (the user which created the first entity) together with the
* last modifying user (user which created the last revision/current
* revision) of the item.
*
* Please note that there is no grantee that the user still exists.
*/
@Column(name = "CREATION_USER_NAME")
@NotAudited
private String creationUserName;
/**
* The name of the user which was the last one which modified the item. This
* information is also available from the revision managed by Envers, but
* getting access to them involves some complex queries. Also it is not
* possible to get the creation user (the user which created the first
* entity) together with the last modifying user (user which created the
* last revision/current revision) of the item.
*
* Please note that there is no grantee that the user still exists.
*/
@Column(name = "LAST_MODIFING_USER_NAME")
@NotAudited
private String lastModifyingUserName;
public ContentItem() { public ContentItem() {
name = new LocalizedString(); name = new LocalizedString();
title = new LocalizedString(); title = new LocalizedString();
@ -376,6 +431,38 @@ public class ContentItem extends CcmObject implements Serializable {
this.workflow = workflow; this.workflow = workflow;
} }
public Date getCreationDate() {
return new Date(creationDate.getTime());
}
public void setCreationDate(final Date creationDate) {
this.creationDate = new Date(creationDate.getTime());
}
public Date getLastModified() {
return new Date(lastModified.getTime());
}
public void setLastModified(final Date lastModified) {
this.lastModified = new Date(lastModified.getTime());
}
public String getCreationUserName() {
return creationUserName;
}
public void setCreationUserName(final String creationUserName) {
this.creationUserName = creationUserName;
}
public String getLastModifyingUserName() {
return lastModifyingUserName;
}
public void setLastModifyingUserName(final String lastModifyingUserName) {
this.lastModifyingUserName = lastModifyingUserName;
}
@Override @Override
public int hashCode() { public int hashCode() {
int hash = super.hashCode(); int hash = super.hashCode();
@ -446,18 +533,18 @@ public class ContentItem extends CcmObject implements Serializable {
@Override @Override
public String toString(final String data) { public String toString(final String data) {
return super.toString(String.format(", itemUuid = %s, " return super.toString(String.format(", itemUuid = %s, "
+ "name = %s, " + "name = %s, "
// + "contentType = { %s }, " // + "contentType = { %s }, "
+ "title = %s, " + "title = %s, "
+ "description = %s, " + "description = %s, "
+ "version = %s, " + "version = %s, "
+ "launchDate = %s, " + "launchDate = %s, "
+ "lifecycle = { %s }, " + "lifecycle = { %s }, "
+ "workflow = { %s }" + "workflow = { %s }"
+ "%s", + "%s",
itemUuid, itemUuid,
Objects.toString(name), Objects.toString(name),
// Objects.toString(contentType), // Objects.toString(contentType),
Objects.toString(title), Objects.toString(title),
Objects.toString(description), Objects.toString(description),
Objects.toString(version), Objects.toString(version),

View File

@ -18,6 +18,7 @@
*/ */
package org.librecms.contentsection; package org.librecms.contentsection;
import java.util.Date;
import org.libreccm.auditing.AbstractAuditedEntityRepository; import org.libreccm.auditing.AbstractAuditedEntityRepository;
import org.libreccm.categorization.Category; import org.libreccm.categorization.Category;
import org.libreccm.core.CcmObject; import org.libreccm.core.CcmObject;
@ -31,6 +32,8 @@ import javax.enterprise.context.RequestScoped;
import javax.inject.Inject; import javax.inject.Inject;
import javax.persistence.NoResultException; import javax.persistence.NoResultException;
import javax.persistence.TypedQuery; import javax.persistence.TypedQuery;
import org.libreccm.security.Shiro;
import org.libreccm.security.User;
import org.libreccm.workflow.Workflow; import org.libreccm.workflow.Workflow;
/** /**
@ -47,6 +50,9 @@ public class ContentItemRepository
@Inject @Inject
private FolderRepository folderRepo; private FolderRepository folderRepo;
@Inject
private Shiro shiro;
@Override @Override
public Long getEntityId(final ContentItem item) { public Long getEntityId(final ContentItem item) {
@ -346,5 +352,27 @@ public class ContentItemRepository
return Optional.empty(); return Optional.empty();
} }
} }
@Override
public void save(final ContentItem item) {
final Date now = new Date();
final Optional<User> user = shiro.getUser();
final String userName;
if (user.isPresent()) {
userName = user.get().getName();
} else {
userName = "--unknown--";
}
if (isNew(item)) {
item.setCreationDate(now);
item.setCreationUserName(userName);
} else {
item.setLastModified(now);
item.setLastModifyingUserName(userName);
}
super.save(item);
}
} }

View File

@ -0,0 +1,12 @@
alter table CCM_CMS.CONTENT_ITEMS
add column CREATION_DATE timestamp;
alter table CCM_CMS.CONTENT_ITEMS
add column CREATION_USER_NAME varchar(255);
alter table CCM_CMS.CONTENT_ITEMS
add column LAST_MODIFIED timestamp;
alter table CCM_CMS.CONTENT_ITEMS
add column LAST_MODIFING_USER_NAME varchar(255);

View File

@ -0,0 +1,12 @@
alter table CCM_CMS.CONTENT_ITEMS
add column CREATION_DATE timestamp;
alter table CCM_CMS.CONTENT_ITEMS
add column CREATION_USER_NAME varchar(255);
alter table CCM_CMS.CONTENT_ITEMS
add column LAST_MODIFIED timestamp;
alter table CCM_CMS.CONTENT_ITEMS
add column LAST_MODIFING_USER_NAME varchar(255);

View File

@ -270,7 +270,11 @@ create schema CCM_CORE;
create table CCM_CMS.CONTENT_ITEMS ( create table CCM_CMS.CONTENT_ITEMS (
ANCESTORS varchar(1024), ANCESTORS varchar(1024),
CREATION_DATE timestamp,
CREATION_USER_NAME varchar(255),
ITEM_UUID varchar(255) not null, ITEM_UUID varchar(255) not null,
LAST_MODIFIED timestamp,
LAST_MODIFING_USER_NAME varchar(255),
LAUNCH_DATE date, LAUNCH_DATE date,
VERSION varchar(255), VERSION varchar(255),
OBJECT_ID bigint not null, OBJECT_ID bigint not null,

View File

@ -270,7 +270,11 @@ create schema CCM_CORE;
create table CCM_CMS.CONTENT_ITEMS ( create table CCM_CMS.CONTENT_ITEMS (
ANCESTORS varchar(1024), ANCESTORS varchar(1024),
CREATION_DATE timestamp,
CREATION_USER_NAME varchar(255),
ITEM_UUID varchar(255) not null, ITEM_UUID varchar(255) not null,
LAST_MODIFIED timestamp,
LAST_MODIFING_USER_NAME varchar(255),
LAUNCH_DATE date, LAUNCH_DATE date,
VERSION varchar(255), VERSION varchar(255),
OBJECT_ID int8 not null, OBJECT_ID int8 not null,

View File

@ -270,7 +270,11 @@ create schema CCM_CORE;
create table CCM_CMS.CONTENT_ITEMS ( create table CCM_CMS.CONTENT_ITEMS (
ANCESTORS varchar(1024), ANCESTORS varchar(1024),
CREATION_DATE timestamp,
CREATION_USER_NAME varchar(255),
ITEM_UUID varchar(255) not null, ITEM_UUID varchar(255) not null,
LAST_MODIFIED timestamp,
LAST_MODIFING_USER_NAME varchar(255),
LAUNCH_DATE date, LAUNCH_DATE date,
VERSION varchar(255), VERSION varchar(255),
OBJECT_ID bigint not null, OBJECT_ID bigint not null,