CCM NG/ccm-cms: FolderBrowser optimization and cleanup

git-svn-id: https://svn.libreccm.org/ccm/ccm_ng@4585 8810af33-2d31-482b-a856-94f89814c4df
ccm-docs
jensp 2017-02-20 17:50:21 +00:00
parent 0a4d5e5c79
commit e32b7a17c9
3 changed files with 161 additions and 168 deletions

View File

@ -81,13 +81,13 @@ public class FolderBrowser extends Table {
globalize("cms.ui.folder.creation_date"), globalize("cms.ui.folder.creation_date"),
globalize("cms.ui.folder.last_modified"), globalize("cms.ui.folder.last_modified"),
globalize("cms.ui.folder.action")}; globalize("cms.ui.folder.action")};
private static final String SORT_ACTION_UP = "sortActionUp"; protected static final String SORT_ACTION_UP = "sortActionUp";
private static final String SORT_ACTION_DOWN = "sortActionDown"; protected static final String SORT_ACTION_DOWN = "sortActionDown";
private final static String SORT_KEY_NAME = "name"; protected final static String SORT_KEY_NAME = "name";
private final static String SORT_KEY_TITLE = "title"; protected final static String SORT_KEY_TITLE = "title";
private final static String SORT_KEY_TYPE = "type"; protected final static String SORT_KEY_TYPE = "type";
private final static String SORT_KEY_LAST_MODIFIED_DATE = "lastModified"; protected final static String SORT_KEY_LAST_MODIFIED_DATE = "lastModified";
private final static String SORT_KEY_CREATION_DATE = "creationDate"; protected final static String SORT_KEY_CREATION_DATE = "creationDate";
private final FolderSelectionModel folderSelectionModel; private final FolderSelectionModel folderSelectionModel;
private final TableActionListener folderChanger; private final TableActionListener folderChanger;
@ -126,13 +126,13 @@ public class FolderBrowser extends Table {
nameColumn = getColumn(0); nameColumn = getColumn(0);
nameColumn.setCellRenderer(new NameCellRenderer()); nameColumn.setCellRenderer(new NameCellRenderer());
nameColumn.setHeaderRenderer(new HeaderCellRenderer(SORT_KEY_NAME)); // nameColumn.setHeaderRenderer(new HeaderCellRenderer(SORT_KEY_NAME));
getColumn(1).setCellRenderer(new LanguagesCellRenderer()); getColumn(1).setCellRenderer(new LanguagesCellRenderer());
getColumn(2).setHeaderRenderer(new HeaderCellRenderer(SORT_KEY_TITLE)); // getColumn(2).setHeaderRenderer(new HeaderCellRenderer(SORT_KEY_TITLE));
getColumn(5).setHeaderRenderer(new HeaderCellRenderer( // getColumn(5).setHeaderRenderer(new HeaderCellRenderer(
SORT_KEY_CREATION_DATE)); // SORT_KEY_CREATION_DATE));
getColumn(6).setHeaderRenderer(new HeaderCellRenderer( // getColumn(6).setHeaderRenderer(new HeaderCellRenderer(
SORT_KEY_LAST_MODIFIED_DATE)); // SORT_KEY_LAST_MODIFIED_DATE));
deleteColumn = getColumn(6); deleteColumn = getColumn(6);
deleteColumn.setCellRenderer(new ActionCellRenderer()); deleteColumn.setCellRenderer(new ActionCellRenderer());
deleteColumn.setAlign("center"); deleteColumn.setAlign("center");

View File

@ -22,6 +22,7 @@ import com.arsdigita.kernel.KernelConfig;
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
import org.libreccm.categorization.Categorization;
import org.libreccm.configuration.ConfigurationManager; import org.libreccm.configuration.ConfigurationManager;
import org.libreccm.core.CcmObject; import org.libreccm.core.CcmObject;
import org.libreccm.core.CcmObjectRepository; import org.libreccm.core.CcmObjectRepository;
@ -30,6 +31,7 @@ import org.libreccm.l10n.LocalizedString;
import org.librecms.CmsConstants; import org.librecms.CmsConstants;
import org.librecms.contentsection.ContentItem; import org.librecms.contentsection.ContentItem;
import org.librecms.contentsection.ContentItemL10NManager; import org.librecms.contentsection.ContentItemL10NManager;
import org.librecms.contentsection.ContentItemVersion;
import org.librecms.contentsection.ContentType; import org.librecms.contentsection.ContentType;
import org.librecms.contentsection.Folder; import org.librecms.contentsection.Folder;
import org.librecms.contenttypes.ContentTypeInfo; import org.librecms.contenttypes.ContentTypeInfo;
@ -41,6 +43,7 @@ import java.util.List;
import java.util.Locale; import java.util.Locale;
import java.util.Objects; import java.util.Objects;
import java.util.Optional; import java.util.Optional;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import javax.annotation.PostConstruct; import javax.annotation.PostConstruct;
@ -48,6 +51,13 @@ 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.TypedQuery;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Expression;
import javax.persistence.criteria.Join;
import javax.persistence.criteria.Order;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import javax.transaction.Transactional; import javax.transaction.Transactional;
/** /**
@ -87,96 +97,26 @@ public class FolderBrowserController {
defaultLocale = kernelConfig.getDefaultLocale(); defaultLocale = kernelConfig.getDefaultLocale();
} }
public long countSubFolders(final Folder folder) { public List<CcmObject> findObjects(final Folder folder, final String orderBy) {
return countSubFolders(folder, "%"); return findObjects(folder, orderBy, -1, -1);
}
public long countSubFolders(final Folder folder,
final String filterTerm) {
final TypedQuery<Long> query = entityManager.createNamedQuery(
"Folder.countSubFolders", Long.class);
query.setParameter("folder", folder);
query.setParameter("term", filterTerm);
return query.getSingleResult();
}
public long countItems(final Folder folder) {
return countItems(folder, "%");
}
public long countItems(final Folder folder,
final String filterTerm) {
final TypedQuery<Long> query = entityManager.createNamedQuery(
"Folder.countItems", Long.class);
query.setParameter("folder", folder);
query.setParameter("term", filterTerm);
return query.getSingleResult();
}
public List<Folder> findSubFolders(final Folder folder) {
return findSubFolders(folder, "%");
}
public List<Folder> findSubFolders(final Folder folder,
final String filterTerm) {
final TypedQuery<Folder> query = entityManager.createNamedQuery(
"Folder.findSubFolders", Folder.class);
query.setParameter("folder", folder);
query.setParameter("term", filterTerm);
return query.getResultList();
}
public List<ContentItem> findItems(final Folder folder) {
return findItems(folder, "%");
}
public List<ContentItem> findItems(final Folder folder,
final int first,
final int maxResults) {
return findItems(folder, "%", first, maxResults);
}
public List<ContentItem> findItems(final Folder folder,
final String filterTerm) {
return findItems(folder, filterTerm, -1, -1);
}
public List<ContentItem> findItems(final Folder folder,
final String filterTerm,
final int first,
final int maxResults) {
final TypedQuery<ContentItem> query = entityManager.createNamedQuery(
"Folder.findItems", ContentItem.class);
query.setParameter("folder", folder);
query.setParameter("term", filterTerm);
if (first > 0 && maxResults > 0) {
query.setFirstResult(first);
query.setMaxResults(maxResults);
}
return query.getResultList();
}
public List<CcmObject> findObjects(final Folder folder) {
return findObjects(folder, -1, -1);
} }
public List<CcmObject> findObjects(final Folder folder, public List<CcmObject> findObjects(final Folder folder,
final String orderBy,
final int first, final int first,
final int maxResults) { final int maxResults) {
return findObjects(folder, "%", first, maxResults); return findObjects(folder, "%", orderBy, first, maxResults);
}
public List<CcmObject> findObjects(final Folder folder,
final String filterTerm) {
return findObjects(folder, filterTerm, -1, -1);
} }
public List<CcmObject> findObjects(final Folder folder, public List<CcmObject> findObjects(final Folder folder,
final String filterTerm, final String filterTerm,
final String orderBy) {
return findObjects(folder, filterTerm, orderBy, -1, -1);
}
public List<CcmObject> findObjects(final Folder folder,
final String filterTerm,
final String orderBy,
final int first, final int first,
final int maxResults) { final int maxResults) {
@ -184,43 +124,21 @@ public class FolderBrowserController {
LOGGER.debug("Trying to find objects in folder {}...", LOGGER.debug("Trying to find objects in folder {}...",
Objects.toString(folder)); Objects.toString(folder));
// final TypedQuery<CcmObject> testQuery1 = entityManager.createQuery( final CriteriaBuilder builder = entityManager.getCriteriaBuilder();
// "SELECT f FROM Folder f " final CriteriaQuery<CcmObject> criteriaQuery = builder
// + "WHERE f.parentCategory = :folder " .createQuery(CcmObject.class);
// + "AND LOWER(f.name) LIKE :term", final Root<CcmObject> from = criteriaQuery.from(CcmObject.class);
// CcmObject.class);
// testQuery1.setParameter("folder", folder);
// testQuery1.setParameter("term", filterTerm);
// final List<CcmObject> testResult1 = testQuery1.getResultList();
// LOGGER.debug("TestResult1: {}",
// Objects.toString(testResult1));
//
// final TypedQuery<CcmObject> testQuery2 = entityManager.createQuery(
// "SELECT i FROM ContentItem i JOIN i.categories c "
// + "WHERE c.category = :folder "
// + "AND c.type = '" + CmsConstants.CATEGORIZATION_TYPE_FOLDER
// + "' "
// + "AND i.version = "
// + "org.librecms.contentsection.ContentItemVersion.DRAFT "
// + "AND (LOWER(i.displayName) LIKE LOWER(:term))",
// CcmObject.class);
// testQuery2.setParameter("folder", folder);
// testQuery2.setParameter("term", filterTerm);
// final List<CcmObject> testResult2 = testQuery2.getResultList();
// LOGGER.debug("TestResult2: {}",
// Objects.toString(testResult2));
final TypedQuery<CcmObject> query = entityManager.createNamedQuery( return entityManager.createQuery(
"Folder.findObjects", CcmObject.class); criteriaQuery
query.setParameter("folder", folder); .select(from)
query.setParameter("term", filterTerm); .where(builder.or(
from.in(findSubFolders(folder, filterTerm)),
if (first > 0 && maxResults > 0) { from.in(findItemsInFolder(folder, filterTerm))))
query.setFirstResult(first); .orderBy(builder.asc(from.get("displayName"))))
query.setMaxResults(maxResults); .setFirstResult(first)
} .setMaxResults(maxResults)
.getResultList();
return query.getResultList();
} }
public long countObjects(final Folder folder) { public long countObjects(final Folder folder) {
@ -229,39 +147,26 @@ public class FolderBrowserController {
public long countObjects(final Folder folder, public long countObjects(final Folder folder,
final String filterTerm) { final String filterTerm) {
final TypedQuery<Long> query = entityManager.createNamedQuery(
"Folder.countObjects", Long.class);
query.setParameter("folder", folder);
query.setParameter("term", filterTerm);
return query.getSingleResult(); final CriteriaBuilder builder = entityManager.getCriteriaBuilder();
} final CriteriaQuery<Long> criteriaQuery = builder.createQuery(
Long.class);
final Root<CcmObject> from = criteriaQuery.from(CcmObject.class);
@Transactional(Transactional.TxType.REQUIRED) return entityManager
List<FolderBrowserTableRow> getObjectRows(final Folder folder) { .createQuery(
final List<CcmObject> objects = findObjects(folder); criteriaQuery
.select(builder.count(from))
return objects.stream() .where(builder.or(
.map(object -> buildRow(object)) from.in(findSubFolders(folder, filterTerm)),
.collect(Collectors.toList()); from.in(findItemsInFolder(folder, filterTerm)))))
.getSingleResult();
} }
@Transactional(Transactional.TxType.REQUIRED) @Transactional(Transactional.TxType.REQUIRED)
List<FolderBrowserTableRow> getObjectRows(final Folder folder, List<FolderBrowserTableRow> getObjectRows(final Folder folder,
final String filterTerm) { final String orderBy) {
final List<CcmObject> objects = findObjects(folder, final List<CcmObject> objects = findObjects(folder, orderBy);
filterTerm);
return objects.stream()
.map(object -> buildRow(object))
.collect(Collectors.toList());
}
@Transactional(Transactional.TxType.REQUIRED)
List<FolderBrowserTableRow> getObjectRows(final Folder folder,
final int first,
final int maxResults) {
final List<CcmObject> objects = findObjects(folder, first, maxResults);
return objects.stream() return objects.stream()
.map(object -> buildRow(object)) .map(object -> buildRow(object))
@ -271,10 +176,40 @@ public class FolderBrowserController {
@Transactional(Transactional.TxType.REQUIRED) @Transactional(Transactional.TxType.REQUIRED)
List<FolderBrowserTableRow> getObjectRows(final Folder folder, List<FolderBrowserTableRow> getObjectRows(final Folder folder,
final String filterTerm, final String filterTerm,
final String orderBy) {
final List<CcmObject> objects = findObjects(folder,
filterTerm,
orderBy);
return objects.stream()
.map(object -> buildRow(object))
.collect(Collectors.toList());
}
@Transactional(Transactional.TxType.REQUIRED)
List<FolderBrowserTableRow> getObjectRows(final Folder folder,
final String orderBy,
final int first,
final int maxResults) {
final List<CcmObject> objects = findObjects(folder,
orderBy,
first,
maxResults);
return objects.stream()
.map(object -> buildRow(object))
.collect(Collectors.toList());
}
@Transactional(Transactional.TxType.REQUIRED)
List<FolderBrowserTableRow> getObjectRows(final Folder folder,
final String filterTerm,
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,
filterTerm, filterTerm,
orderBy,
first, first,
maxResults); maxResults);
@ -318,7 +253,8 @@ public class FolderBrowserController {
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(type); final ContentTypeInfo typeInfo = typesManager.getContentTypeInfo(
type);
row.setTypeLabelBundle(typeInfo.getLabelBundle()); row.setTypeLabelBundle(typeInfo.getLabelBundle());
row.setTypeLabelKey(typeInfo.getLabelKey()); row.setTypeLabelKey(typeInfo.getLabelKey());
row.setFolder(false); row.setFolder(false);
@ -344,4 +280,55 @@ public class FolderBrowserController {
} }
} }
/**
* Creates a Criteria Query
*
* @param folder
* @param filterTerm
*
* @return
*/
private List<Folder> findSubFolders(final Folder folder,
final String filterTerm) {
final CriteriaBuilder builder = entityManager
.getCriteriaBuilder();
final CriteriaQuery<Folder> query = builder.createQuery(
Folder.class);
final Root<Folder> from = query.from(Folder.class);
return entityManager.createQuery(
query.where(builder.and(
builder.equal(from.get("parentCategory"), folder),
builder.like(builder.lower(from.get("name")), filterTerm))))
.getResultList();
}
private List<ContentItem> findItemsInFolder(
final Folder folder,
final String filterTerm) {
final CriteriaBuilder builder = entityManager
.getCriteriaBuilder();
final CriteriaQuery<ContentItem> query = builder.createQuery(
ContentItem.class);
final Root<ContentItem> fromItem = query.from(ContentItem.class);
final Join<ContentItem, Categorization> join = fromItem.join(
"categories");
return entityManager.createQuery(query
.select(fromItem)
.where(builder.and(
builder.equal(join.get("category"), folder),
builder.equal(join.get("type"),
CmsConstants.CATEGORIZATION_TYPE_FOLDER),
builder.equal(fromItem.get("version"),
ContentItemVersion.DRAFT),
builder.like(fromItem.get("displayName"),
filterTerm))))
.getResultList();
}
} }

View File

@ -39,7 +39,8 @@ import java.util.List;
class FolderBrowserTableModelBuilder extends LockableImpl class FolderBrowserTableModelBuilder extends LockableImpl
implements TableModelBuilder { implements TableModelBuilder {
private final static Logger LOGGER = LogManager.getLogger(FolderBrowserTableModelBuilder.class); private final static Logger LOGGER = LogManager.getLogger(
FolderBrowserTableModelBuilder.class);
@Override @Override
public TableModel makeModel(final Table table, public TableModel makeModel(final Table table,
@ -78,9 +79,16 @@ class FolderBrowserTableModelBuilder extends LockableImpl
LOGGER.debug("Retrieving table rows..."); LOGGER.debug("Retrieving table rows...");
final List<FolderBrowserTableRow> rows; final List<FolderBrowserTableRow> rows;
if (filterTerm == null) { if (filterTerm == null) {
rows = controller.getObjectRows(folder, first -1, pageSize); rows = controller.getObjectRows(folder,
"name",
first - 1,
pageSize);
} else { } else {
rows = controller.getObjectRows(folder, filter, first- 1, pageSize); rows = controller.getObjectRows(folder,
filter,
"name",
first - 1,
pageSize);
} }
LOGGER.debug("Retrieve table rows in {} ms.", LOGGER.debug("Retrieve table rows in {} ms.",
@ -89,6 +97,4 @@ class FolderBrowserTableModelBuilder extends LockableImpl
} }
} }
} }