CCM NG/ccm-cms: Next part of migration of the FolderBrowser

git-svn-id: https://svn.libreccm.org/ccm/ccm_ng@4560 8810af33-2d31-482b-a856-94f89814c4df
pull/2/head
jensp 2017-02-11 18:15:52 +00:00
parent e55aa01f1e
commit 82d0ceffbd
11 changed files with 959 additions and 160 deletions

View File

@ -8,3 +8,4 @@ ccmRealm = org.libreccm.security.CcmShiroRealm
ccmRealm.credentialsMatcher = $passwordMatcher
securityManager.realms = $ccmRealm
securityManager.rememberMeManager.cipherKey = p5h/Aphy0gfV+XThbEPqSG4iQNh2fTNH9ZEkSBAt/Ok=

View File

@ -92,7 +92,7 @@ public class FlatItemList extends SegmentedPanel implements FormProcessListener,
// private final ActionLink m_setHomeFolderAction;
// private final ActionLink m_removeHomeFolderAction;
private final ActionLink createFolderAction;
private final ActionLink togglePrivateAction;
// private final ActionLink togglePrivateAction;
// private final Label m_homeFolderLabel;
private final Segment browseSegment;
private final Segment newItemSegment;
@ -245,28 +245,28 @@ public class FlatItemList extends SegmentedPanel implements FormProcessListener,
permissionActions.setSubject(permissionsPane);
// An action
togglePrivateAction = new ActionLink(new Label(new PrintListener() {
@Override
public void prepare(final PrintEvent event) {
final PageState state = event.getPageState();
final Label target = (Label) event.getTarget();
final Folder currentFolder = folderRequestLocal.getFolder(state);
// ACSObject parent = currentFolder.getParent();
// if (context == null) {
target.setLabel(new GlobalizedMessage(
"cms.ui.restore_default_permissions",
CmsConstants.CMS_BUNDLE));
// } else {
// target.setLabel(GlobalizationUtil
// .globalize("cms.ui.use_custom_permissions"));
// togglePrivateAction = new ActionLink(new Label(new PrintListener() {
//
// @Override
// public void prepare(final PrintEvent event) {
// final PageState state = event.getPageState();
// final Label target = (Label) event.getTarget();
// final Folder currentFolder = folderRequestLocal.getFolder(state);
// // ACSObject parent = currentFolder.getParent();
//
//// if (context == null) {
// target.setLabel(new GlobalizedMessage(
// "cms.ui.restore_default_permissions",
// CmsConstants.CMS_BUNDLE));
//// } else {
//// target.setLabel(GlobalizationUtil
//// .globalize("cms.ui.use_custom_permissions"));
//// }
// }
}
}));
togglePrivateAction.addActionListener(this);
permissionActions.addAction(togglePrivateAction);
//
// }));
// togglePrivateAction.addActionListener(this);
// permissionActions.addAction(togglePrivateAction);
// The 'new item' segment
newItemSegment.addHeader(new Label(globalize("cms.ui.new_item")));
@ -305,12 +305,13 @@ public class FlatItemList extends SegmentedPanel implements FormProcessListener,
super.register(page);
page.setVisibleDefault(chooseLabel, false);
// page.setVisibleDefault(browseSegment, true);
page.setVisibleDefault(newItemSegment, false);
page.setVisibleDefault(newFolderSegment, false);
page.setVisibleDefault(editFolderSegment, false);
page
.addComponentStateParam(this, typeSelectionModel.getStateParameter());
page.addComponentStateParam(this,
typeSelectionModel.getStateParameter());
page.addActionListener(new ActionListener() {
@ -348,20 +349,15 @@ public class FlatItemList extends SegmentedPanel implements FormProcessListener,
browseMode(state);
}
browseSegment.setVisible(state, true);
// newItemSegment.setVisible(state, newItem);
// newFolderSegment.setVisible(state, newItem);
//newItemForm.setVisible(state, newItem);
createFolderAction.setVisible(state, newItem);
newItemForm.setVisible(state, newItem);
final boolean editItem = permissionChecker.isPermitted(
ItemPrivileges.EDIT, folder);
editFolderAction.setVisible(state, editItem);
chooseLabel.setVisible(state, editItem);
editFolderSegment.setVisible(state, editItem);
// chooseLabel.setVisible(state, editItem);
// editFolderSegment.setVisible(state, editItem);
if (permissionChecker.isPermitted(ItemPrivileges.ADMINISTER, folder)) {
permissionsSegment.setVisible(state, true);
@ -457,9 +453,10 @@ public class FlatItemList extends SegmentedPanel implements FormProcessListener,
} else if (source == editFolderAction) {
permissionsSegment.setVisible(state, false);
editFolderSegment.setVisible(state, true);
} else if (source == togglePrivateAction) {
togglePermissions(state);
}
// else if (source == togglePrivateAction) {
// togglePermissions(state);
// }
// } else if (source == m_setHomeFolderAction) {
// User user = Web.getWebContext().getUser();
// Folder folder = m_folder.getFolder(state);
@ -505,15 +502,15 @@ public class FlatItemList extends SegmentedPanel implements FormProcessListener,
return permissionsPane;
}
public void setPermissionLinkVis(PageState state) {
final Folder currentFolder = folderRequestLocal.getFolder(state);
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
final PermissionChecker permissionChecker = cdiUtil.findBean(
PermissionChecker.class);
if (!permissionChecker.isPermitted(ItemPrivileges.ADMINISTER,
currentFolder)) {
togglePrivateAction.setVisible(state, false);
}
public void setPermissionLinkVis(final PageState state) {
// final Folder currentFolder = folderRequestLocal.getFolder(state);
// final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
// final PermissionChecker permissionChecker = cdiUtil.findBean(
// PermissionChecker.class);
// if (!permissionChecker.isPermitted(ItemPrivileges.ADMINISTER,
// currentFolder)) {
// togglePrivateAction.setVisible(state, false);
// }
}
private static class SectionNewItemForm extends NewItemForm {

View File

@ -76,10 +76,12 @@ import org.librecms.contentsection.ContentItemManager;
import org.librecms.contentsection.ContentItemRepository;
import org.librecms.contentsection.ContentSection;
import org.librecms.contentsection.ContentSectionManager;
import org.librecms.contentsection.Folder;
import org.librecms.contentsection.privileges.ItemPrivileges;
import org.librecms.dispatcher.ItemResolver;
import java.util.Date;
import java.util.stream.Collectors;
/**
* Browse folders and items. If the user clicks on a folder, the folder
@ -262,6 +264,18 @@ public class FolderBrowser extends Table {
return m_folderSize;
}
protected Paginator getPaginator() {
throw new UnsupportedOperationException();
}
protected String getFilter(final PageState state) {
return (String) state.getValue(m_filter);
}
protected String getAtoZfilter(final PageState state) {
return (String) state.getValue(m_aToZfilter);
}
private class FolderTableModelBuilder
extends AbstractTableModelBuilder
implements PaginationModelBuilder,
@ -269,9 +283,10 @@ public class FolderBrowser extends Table {
private final FolderSelectionModel folderModel;
private final FolderBrowser folderBrowser;
private final ContentItemRepository itemRepo;
private final ConfigurationManager confManager;
private final ContentSectionManager sectionManager;
// private final ContentItemRepository itemRepo;
// private final ConfigurationManager confManager;
// private final ContentSectionManager sectionManager;
final FolderBrowserController controller;
public FolderTableModelBuilder(final FolderSelectionModel folderModel) {
this(folderModel, null);
@ -282,99 +297,54 @@ public class FolderBrowser extends Table {
this.folderModel = folderModel;
this.folderBrowser = folderBrowser;
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
itemRepo = cdiUtil.findBean(ContentItemRepository.class);
confManager = cdiUtil.findBean(ConfigurationManager.class);
sectionManager = cdiUtil.findBean(ContentSectionManager.class);
controller = cdiUtil.findBean(FolderBrowserController.class);
// itemRepo = cdiUtil.findBean(ContentItemRepository.class);
// confManager = cdiUtil.findBean(ConfigurationManager.class);
// sectionManager = cdiUtil.findBean(ContentSectionManager.class);
}
@Override
public TableModel makeModel(final Table table, final PageState state) {
final FolderSelectionModel folderSelectionModel
= getFolderSelectionModel();
final Folder folder = folderSelectionModel.getSelectedObject(state);
if (folder == null) {
return Table.EMPTY_MODEL;
} else {
table.getRowSelectionModel().clearSelection(state);
final List<Folder> subFolders = folder.getSubFolders();
final List<ContentItem> items = folder.getObjects()
.stream()
.map(categorization -> categorization.getCategorizedObject())
.filter(object -> object instanceof ContentItem)
.map(object -> (ContentItem) object)
.collect(Collectors.toList());
final List<CcmObject> objects = new ArrayList<>();
objects.addAll(subFolders);
objects.addAll(items);
}
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public int getTotalSize(final Paginator paginator,
final PageState state) {
final Category folder = (Category) folderModel.getSelectedObject(
state);
throw new UnsupportedOperationException();
/*
SELECT c.categorizedObject FROM Categorization c "
+ "WHERE c.category = :folder "
+ "AND TYPE(c.categorizedObject) IN ContentItem"
+ "AND (LOWER(c.categorizationObject.displayName) LIKE CONCAT(LOWER(:name), '%') "
44+ "OR LOWER(c.categorizedObject.name.value) LIKE CONCAT(:name), '%')
*/
final CriteriaBuilder criteriaBuilder = itemRepo.
getCriteriaBuilder();
final CriteriaQuery<ContentItem> query = criteriaBuilder.
createQuery(ContentItem.class);
final Root<Categorization> root = query.from(Categorization.class);
final Root<ContentItem> itemRoot = query.from(ContentItem.class);
//final List<Predicate> predicates = new ArrayList<>();
final Predicate categoryPredicate = criteriaBuilder.equal(
root.get("Categorization.category"), folder);
final Predicate typePredicate = criteriaBuilder.equal(
itemRoot.type(), ContentItem.class);
final List<Predicate> filters = new ArrayList<>();
final KernelConfig kernelConfig = confManager.findConfiguration(
KernelConfig.class);
final Locale defaultLocale = kernelConfig.getDefaultLocale();
if (state.getValue(m_aToZfilter) != null) {
filters.add(criteriaBuilder.like(criteriaBuilder.lower(
root.get("Categorization.categorizedObject.displayName")),
String.format("%s%%",
((String) state.
getValue(
m_aToZfilter)).
toLowerCase(
defaultLocale))));
filters.add(criteriaBuilder.like(criteriaBuilder.lower(
root.get("Categorization.categoriziedObject.name.value")),
String.format("%s%%",
(String) state.
getValue(
m_aToZfilter))
.toLowerCase(defaultLocale)));
}
if (state.getValue(m_filter) != null) {
filters.add(criteriaBuilder.like(criteriaBuilder.lower(
root.get("Categorization.categorizedObject.displayName")),
String.format("%s%%",
((String) state.
getValue(
m_filter)))));
filters.add(criteriaBuilder.like(criteriaBuilder.lower(
root.get("Categorization.categorizedObject.name.value")),
String.format("%s%%",
((String) state.
getValue(
m_filter)))));
}
final Predicate filtersPredicate = criteriaBuilder.or(filters.
toArray(new Predicate[filters.size()]));
final Predicate predicates = criteriaBuilder.and(categoryPredicate,
typePredicate,
filtersPredicate);
query.where(predicates).select(itemRoot);
return itemRepo.executeCriteriaQuery(query.where(predicates).select(
itemRoot)).size();
}
@Override
public boolean isVisible(final PageState state) {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
return folderBrowser != null && folderBrowser.isVisible(state);
}
@Override
public long getFolderSize(final PageState state) {
return itemRepo.countItemsInFolder((Category) folderModel.
getSelectedObject(state));
throw new UnsupportedOperationException();
}
}
@ -382,21 +352,23 @@ public class FolderBrowser extends Table {
private class HeaderCellRenderer
extends com.arsdigita.cms.ui.util.DefaultTableCellRenderer {
private String m_key;
private final String headerKey;
public HeaderCellRenderer(String key) {
public HeaderCellRenderer(final String headerKey) {
super(true);
m_key = key;
this.headerKey = headerKey;
}
@Override
public Component getComponent(final Table table, final PageState state,
Object value,
boolean isSelected, Object key,
int row, int column) {
final Object value,
boolean isSelected,
final Object key,
final int row,
final int column) {
String headerName = (String) ((GlobalizedMessage) value).localize();
String sortKey = (String) state.getValue(m_sortType);
final boolean isCurrentKey = sortKey.equals(m_key);
final boolean isCurrentKey = sortKey.equals(key);
final String currentSortDirection = (String) state.getValue(
m_sortDirection);
String imageURLStub;
@ -422,7 +394,7 @@ public class FolderBrowser extends Table {
}
ps.setControlEvent(table,
sortDirectionAction,
m_key);
headerKey);
}
};

View File

@ -0,0 +1,300 @@
/*
* Copyright (C) 2017 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 com.arsdigita.cms.ui.folder;
import com.arsdigita.kernel.KernelConfig;
import org.libreccm.configuration.ConfigurationManager;
import org.libreccm.core.CcmObject;
import org.libreccm.l10n.GlobalizationHelper;
import org.libreccm.l10n.LocalizedString;
import org.librecms.contentsection.ContentItem;
import org.librecms.contentsection.ContentItemL10NManager;
import org.librecms.contentsection.Folder;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Locale;
import java.util.stream.Collectors;
import javax.annotation.PostConstruct;
import javax.enterprise.context.RequestScoped;
import javax.inject.Inject;
import javax.persistence.EntityManager;
import javax.persistence.TypedQuery;
import javax.transaction.Transactional;
/**
*
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
*/
@RequestScoped
public class FolderBrowserController {
@Inject
private EntityManager entityManager;
@Inject
private ConfigurationManager confManager;
@Inject
private GlobalizationHelper globalizationHelper;
@Inject
private ContentItemL10NManager itemL10NManager;
private Locale defaultLocale;
@PostConstruct
private void init() {
final KernelConfig kernelConfig = confManager.findConfiguration(
KernelConfig.class);
defaultLocale = kernelConfig.getDefaultLocale();
}
public long countSubFolders(final Folder folder) {
return countSubFolders(folder, "%");
}
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,
final int first,
final int maxResults) {
return findObjects(folder, "%", 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,
final String filterTerm,
final int first,
final int maxResults) {
final TypedQuery<CcmObject> query = entityManager.createNamedQuery(
"Folder.findObjects", CcmObject.class);
query.setParameter("folder", folder);
query.setParameter(filterTerm, filterTerm);
if (first > 0 && maxResults > 0) {
query.setFirstResult(first);
query.setMaxResults(maxResults);
}
return query.getResultList();
}
public int countObjects(final Folder folder) {
return countObjects(folder, -1, -1);
}
public int countObjects(final Folder folder,
final int frist,
final int maxResults) {
return countObjects(folder, "%", frist, maxResults);
}
public int countObjects(final Folder folder,
final String filterTerm) {
return countObjects(folder, filterTerm, -1, -1);
}
public int countObjects(final Folder folder,
final String filterTerm,
final int first,
final int maxResults) {
final TypedQuery<Integer> query = entityManager.createNamedQuery(
"Folder.countObjects", Integer.class);
query.setParameter("folder", folder);
query.setParameter(filterTerm, filterTerm);
if (first > 0 && maxResults > 0) {
query.setFirstResult(first);
query.setMaxResults(maxResults);
}
return query.getSingleResult();
}
@Transactional(Transactional.TxType.REQUIRED)
protected List<FolderBrowserTableRow> getObjectRows(final Folder folder) {
final List<CcmObject> objects = findObjects(folder);
return objects.stream()
.map(object -> buildRow(object))
.collect(Collectors.toList());
}
@Transactional(Transactional.TxType.REQUIRED)
protected List<FolderBrowserTableRow> getObjectRows(final Folder folder,
final String filterTerm) {
final List<CcmObject> objects = findObjects(folder,
filterTerm);
return objects.stream()
.map(object -> buildRow(object))
.collect(Collectors.toList());
}
@Transactional(Transactional.TxType.REQUIRED)
protected List<FolderBrowserTableRow> getObjectRows(final Folder folder,
final int first,
final int maxResults) {
final List<CcmObject> objects = findObjects(folder, first, maxResults);
return objects.stream()
.map(object -> buildRow(object))
.collect(Collectors.toList());
}
@Transactional(Transactional.TxType.REQUIRED)
protected List<FolderBrowserTableRow> getObjectRows(final Folder folder,
final String filterTerm,
final int first,
final int maxResults) {
final List<CcmObject> objects = findObjects(folder,
filterTerm,
first,
maxResults);
return objects.stream()
.map(object -> buildRow(object))
.collect(Collectors.toList());
}
private FolderBrowserTableRow buildRow(final CcmObject object) {
final FolderBrowserTableRow row = new FolderBrowserTableRow();
if (object instanceof Folder) {
final Folder folder = (Folder) object;
row.setObjectId(folder.getObjectId());
row.setObjectUuid(folder.getUuid());
row.setName(folder.getName());
row.setLanguages(Collections.emptyList());
if (folder.getTitle().hasValue(globalizationHelper
.getNegotiatedLocale())) {
row.setTitle(folder.getTitle().getValue(globalizationHelper
.getNegotiatedLocale()));
} else {
row.setTitle(folder.getTitle().getValue(defaultLocale));
}
} else if (object instanceof ContentItem) {
final ContentItem item = (ContentItem) object;
row.setObjectId(item.getObjectId());
row.setObjectUuid(item.getItemUuid());
row.setName(item.getName().getValue(defaultLocale));
final List<Locale> languages = new ArrayList<>(itemL10NManager
.availableLanguages(item));
languages.sort((lang1, lang2) -> lang1.toString().compareTo(
lang2.toString()));
row.setLanguages(languages);
if (item.getTitle().hasValue(globalizationHelper
.getNegotiatedLocale())) {
row.setTitle(item.getTitle().getValue(globalizationHelper
.getNegotiatedLocale()));
} else {
row.setTitle(item.getTitle().getValue(defaultLocale));
}
} else {
row.setObjectId(object.getObjectId());
row.setObjectUuid(object.getUuid());
row.setName("???");
row.setLanguages(Collections.emptyList());
final LocalizedString title = new LocalizedString();
title.addValue(globalizationHelper.getNegotiatedLocale(), "???");
}
return row;
}
}

View File

@ -0,0 +1,73 @@
/*
* Copyright (C) 2017 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 com.arsdigita.cms.ui.folder;
import com.arsdigita.bebop.PageState;
import org.libreccm.cdi.utils.CdiUtil;
import org.librecms.contentsection.Folder;
/**
*
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
*/
class FolderBrowserFilterFormModelBuilder
implements FolderManipulator.FilterFormModelBuilder{
private final FolderBrowser folderBrowser;
public FolderBrowserFilterFormModelBuilder(final FolderBrowser folderBrowser) {
this.folderBrowser = folderBrowser;
}
@Override
public long getFolderSize(final PageState state) {
final FolderSelectionModel folderSelectionModel = folderBrowser
.getFolderSelectionModel();
final Folder folder = folderSelectionModel.getSelectedObject(state);
if (folder == null) {
return 0;
} else {
folderBrowser.getRowSelectionModel().clearSelection(state);
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
final FolderBrowserController controller = cdiUtil.findBean(
FolderBrowserController.class);
final String filter = folderBrowser.getFilter(state);
final String atozFilter = folderBrowser.getAtoZfilter(state);
final String filterTerm;
if (filter != null && !filter.trim().isEmpty()) {
filterTerm = filter.trim();
} else if (atozFilter != null && !atozFilter.trim().isEmpty()) {
filterTerm = atozFilter.trim();
} else {
filterTerm = null;
}
if (filterTerm == null) {
return controller.countObjects(folder);
} else {
return controller.countObjects(folder);
}
}
}
}

View File

@ -0,0 +1,81 @@
/*
* Copyright (C) 2017 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 com.arsdigita.cms.ui.folder;
import com.arsdigita.bebop.PageState;
import com.arsdigita.bebop.PaginationModelBuilder;
import com.arsdigita.bebop.Paginator;
import com.arsdigita.bebop.Table;
import org.libreccm.cdi.utils.CdiUtil;
import org.librecms.contentsection.Folder;
/**
*
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
*/
class FolderBrowserPaginationModelBuilder implements PaginationModelBuilder {
private final FolderBrowser folderBrowser;
public FolderBrowserPaginationModelBuilder(final FolderBrowser folderBrowser) {
this.folderBrowser = folderBrowser;
}
@Override
public int getTotalSize(final Paginator paginator,
final PageState state) {
final FolderSelectionModel folderSelectionModel = folderBrowser
.getFolderSelectionModel();
final Folder folder = folderSelectionModel.getSelectedObject(state);
if (folder == null) {
return 0;
} else {
folderBrowser.getRowSelectionModel().clearSelection(state);
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
final FolderBrowserController controller = cdiUtil.findBean(
FolderBrowserController.class);
final String filter = folderBrowser.getFilter(state);
final String atozFilter = folderBrowser.getAtoZfilter(state);
final int first = paginator.getFirst(state);
final int pageSize = paginator.getPageSize(state);
final String filterTerm;
if (filter != null && !filter.trim().isEmpty()) {
filterTerm = filter.trim();
} else if (atozFilter != null && !atozFilter.trim().isEmpty()) {
filterTerm = atozFilter.trim();
} else {
filterTerm = null;
}
if (filterTerm == null) {
return controller.countObjects(folder, first, pageSize);
} else {
return controller.countObjects(folder, filter, first, pageSize);
}
}
}
@Override
public boolean isVisible(final PageState state) {
return folderBrowser != null && folderBrowser.isVisible(state);
}
}

View File

@ -0,0 +1,95 @@
/*
* Copyright (C) 2017 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 com.arsdigita.cms.ui.folder;
import com.arsdigita.bebop.table.TableModel;
import java.util.Iterator;
import java.util.List;
import javax.ws.rs.DELETE;
/**
* Table model for the {@link FolderBrowser}.
*
* @see {FolderBrowserTableModelBuilder}
*
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
*/
class FolderBrowserTableModel implements TableModel {
private static final int COL_NAME = 0;
private static final int COL_LANGUAGES = 1;
private static final int COL_TITLE = 2;
private static final int COL_TYPE = 3;
private static final int COL_CREATION_DATE = 4;
private static final int COL_LAST_MODIFIED = 5;
private static final int COL_DELETEABLE = 6;
private final Iterator<FolderBrowserTableRow> iterator;
private FolderBrowserTableRow currentRow;
public FolderBrowserTableModel(final List<FolderBrowserTableRow> rows) {
iterator = rows.iterator();
}
@Override
public int getColumnCount() {
return 6;
}
@Override
public boolean nextRow() {
if (iterator.hasNext()) {
currentRow = iterator.next();
return true;
} else {
return false;
}
}
@Override
public Object getElementAt(final int columnIndex) {
switch(columnIndex) {
case COL_NAME:
return currentRow.getName();
case COL_LANGUAGES:
return currentRow.getLanguages();
case COL_TITLE:
return currentRow.getTitle();
case COL_TYPE:
return currentRow.getType();
case COL_CREATION_DATE:
return currentRow.getCreated();
case COL_LAST_MODIFIED:
return currentRow.getLastModified();
case COL_DELETEABLE:
return currentRow.isDeletable();
default:
throw new IllegalArgumentException(String.format(
"Illegal column index %d.", columnIndex));
}
}
@Override
public Object getKeyAt(final int columnIndex) {
return currentRow.getObjectId();
}
}

View File

@ -0,0 +1,89 @@
/*
* Copyright (C) 2017 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 com.arsdigita.cms.ui.folder;
import com.arsdigita.bebop.PageState;
import com.arsdigita.bebop.Paginator;
import com.arsdigita.bebop.Table;
import com.arsdigita.bebop.table.TableModel;
import com.arsdigita.bebop.table.TableModelBuilder;
import com.arsdigita.util.LockableImpl;
import org.libreccm.cdi.utils.CdiUtil;
import org.librecms.contentsection.ContentItem;
import org.librecms.contentsection.Folder;
import java.util.List;
import java.util.stream.Collectors;
/**
*
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
*/
class FolderBrowserTableModelBuilder extends LockableImpl
implements TableModelBuilder {
@Override
public TableModel makeModel(final Table table,
final PageState state) {
if (!(table instanceof FolderBrowser)) {
throw new IllegalArgumentException(
"The FolderBrowserTableModelBuilder can be used for the FolderBrowser.");
}
final FolderBrowser folderBrowser = (FolderBrowser) table;
final FolderSelectionModel folderSelectionModel = folderBrowser
.getFolderSelectionModel();
final Folder folder = folderSelectionModel.getSelectedObject(state);
if (folder == null) {
return Table.EMPTY_MODEL;
} else {
folderBrowser.getRowSelectionModel().clearSelection(state);
final Paginator paginator = folderBrowser.getPaginator();
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
final FolderBrowserController controller = cdiUtil.findBean(
FolderBrowserController.class);
final String filter = folderBrowser.getFilter(state);
final String atozFilter = folderBrowser.getAtoZfilter(state);
final int first = paginator.getFirst(state);
final int pageSize = paginator.getPageSize(state);
final String filterTerm;
if (filter != null && !filter.trim().isEmpty()) {
filterTerm = filter.trim();
} else if (atozFilter != null && !atozFilter.trim().isEmpty()) {
filterTerm = atozFilter.trim();
} else {
filterTerm = null;
}
final List<FolderBrowserTableRow> rows;
if (filterTerm == null) {
rows = controller.getObjectRows(folder, first, pageSize);
} else {
rows = controller.getObjectRows(folder, filter, first, pageSize);
}
return new FolderBrowserTableModel(rows);
}
}
}

View File

@ -0,0 +1,118 @@
/*
* Copyright (C) 2017 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 com.arsdigita.cms.ui.folder;
import org.libreccm.l10n.LocalizedString;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.Locale;
/**
*
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
*/
class FolderBrowserTableRow {
private long objectId;
private String objectUuid;
private String name;
private List<Locale> languages;
private String title;
private String type;
private Date created;
private Date lastModified;
private boolean deletable;
public long getObjectId() {
return objectId;
}
protected void setObjectId(final long objectId) {
this.objectId = objectId;
}
public String getObjectUuid() {
return objectUuid;
}
protected void setObjectUuid(final String objectUuid) {
this.objectUuid = objectUuid;
}
public String getName() {
return name;
}
protected void setName(String name) {
this.name = name;
}
public List<Locale> getLanguages() {
return Collections.unmodifiableList(languages);
}
protected void setLanguages(final List<Locale> languages) {
this.languages = languages;
}
public String getTitle() {
return title;
}
protected void setTitle(final String title) {
this.title = title;
}
public String getType() {
return type;
}
protected void setType(final String type) {
this.type = type;
}
public Date getCreated() {
return new Date(created.getTime());
}
protected void setCreated(final Date created) {
this.created = new Date(created.getTime());
}
public Date getLastModified() {
return new Date(lastModified.getTime());
}
protected void setLastModified(final Date lastModified) {
this.lastModified = new Date(lastModified.getTime());
}
public boolean isDeletable() {
return deletable;
}
protected void setDeletable(final boolean deletable) {
this.deletable = deletable;
}
}

View File

@ -25,6 +25,7 @@ import javax.persistence.Table;
import org.libreccm.categorization.Category;
import org.libreccm.core.CcmObject;
import org.librecms.CmsConstants;
import java.io.Serializable;
import java.util.Collections;
@ -59,6 +60,79 @@ import static org.librecms.CmsConstants.*;
@NamedQuery(
name = "Folder.findByName",
query = "SELECT f FROM Folder f WHERE f.name = :name")
,
@NamedQuery(
name = "Folder.findSubFolders",
query = "SELECT f FROM Folder f WHERE f.parentCategory = :parent "
+ "AND LOWER(f.name) LIKE :term "
+ "ORDER BY f.name"
)
,
@NamedQuery(
name = "Folder.countSubFolders",
query
= "SELECT COUNT(f) FROM Folder f WHERE f.parentCategory = :parent "
+ "AND LOWER(f.name) LIKE :term"
)
,
@NamedQuery(
name = "Folder.findItems",
query = "SELECT c.categorizedObject "
+ "FROM Categorization c "
+ "WHERE c.category = :folder "
+ "AND TYPE(c.categorizedObject) IN ContentItem "
+ "AND c.type = '" + CATEGORIZATION_TYPE_FOLDER + "' "
+ "AND c.version = "
+ "org.librecms.contentsection.ContentItemVersion.DRAFT"
+ "AND (LOWER(c.categorizedObject.displayName) LIKE :term "
+ "OR LOWER(c.categorizedObject.name.value) LIKE :term) "
+ "ORDER BY c.categorizedObject.name")
,
@NamedQuery(
name = "Folder.countItems",
query = "SELECT COUNT(c).categorizedObject "
+ "FROM Categorization c "
+ "WHERE c.category = :folder "
+ "AND Type(c.categorizedObject) IN ContentItem "
+ "AND c.type = '" + CATEGORIZATION_TYPE_FOLDER + "' "
+ "AND c.version = "
+ "org.librecms.contentsection.ContentItemVersion.DRAFT"
+ "AND (LOWER(c.categorizedObject.displayName) LIKE :term "
+ "OR LOWER(c.categorizedObject.name.value) LIKE :term)")
,
@NamedQuery(
name = "Folder.findObjects",
query = "SELECT o FROM CcmObject o "
+ "WHERE o IN (SELECT f FROM Folder f "
+ "WHERE f.parentCategory = :parent "
+ "AND lower(f.name) LIKE :term) "
+ "OR o IN (SELECT c.categorizedObject "
+ "FROM Categorization c "
+ "WHERE c.category = :folder "
+ "AND TYPE(c.categorizedObject) IN ContentItem "
+ "AND c.type = '" + CATEGORIZATION_TYPE_FOLDER + "' "
+ "AND c.version = "
+ "org.librecms.contentsection.ContentItemVersion.DRAFT"
+ "AND (LOWER(c.categorizedObject.displayName) LIKE :term "
+ "OR LOWER(c.categorizedObject.name.value) LIKE :term)) "
+ "ORDER BY o.displayName")
,
@NamedQuery(
name = "Folder.countObjects",
query = "SELECT COUNT(o) FROM CcmObject o "
+ "WHERE o IN (SELECT f FROM Folder f "
+ "WHERE f.parentCategory = :parent "
+ "AND lower(f.name) LIKE :term) "
+ "OR o IN (SELECT c.categorizedObject "
+ "FROM Categorization c "
+ "WHERE c.category = :folder "
+ "AND TYPE(c.categorizedObject) IN ContentItem "
+ "AND c.type = '" + CATEGORIZATION_TYPE_FOLDER + "' "
+ "AND c.version = "
+ "org.librecms.contentsection.ContentItemVersion.DRAFT"
+ "AND (LOWER(c.categorizedObject.displayName) LIKE :term "
+ "OR LOWER(c.categorizedObject.name.value) LIKE :term)) "
+ "ORDER BY o.displayName")
})
public class Folder extends Category implements Serializable {
@ -115,7 +189,6 @@ public class Folder extends Category implements Serializable {
// return (Folder) getParentCategory();
// }
// }
@Override
public int hashCode() {
int hash = super.hashCode();

View File

@ -250,32 +250,32 @@ public class SegmentedPanel extends SimpleContainer
add(c);
}
@Override
public boolean isVisible(final PageState state) {
boolean result = super.isVisible(state);
if (m_header != null) {
result = result && m_header.isVisible(state);
final Iterator children = m_header.children();
while (children.hasNext()) {
final Component component = (Component) children.next();
result = result && component.isVisible(state);
}
}
if (m_body != null) {
result = result && m_body.isVisible(state);
final Iterator children = m_body.children();
while (children.hasNext()) {
final Component component = (Component) children.next();
result = result && component.isVisible(state);
}
}
return result;
}
// @Override
// public boolean isVisible(final PageState state) {
// boolean result = super.isVisible(state);
//
// if (m_header != null) {
// result = result && m_header.isVisible(state);
//
// final Iterator children = m_header.children();
// while (children.hasNext()) {
// final Component component = (Component) children.next();
// result = result && component.isVisible(state);
// }
// }
//
// if (m_body != null) {
// result = result && m_body.isVisible(state);
//
// final Iterator children = m_body.children();
// while (children.hasNext()) {
// final Component component = (Component) children.next();
// result = result && component.isVisible(state);
// }
// }
//
// return result;
// }
/**
* Generate the XML for this segment