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-94f89814c4dfpull/2/head
parent
d821dbe5d7
commit
faa27466bf
|
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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),
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
||||||
|
|
@ -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);
|
||||||
|
|
||||||
|
|
@ -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,
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue