From 82d0ceffbdd0e322d6c4de6addd8596159934461 Mon Sep 17 00:00:00 2001 From: jensp Date: Sat, 11 Feb 2017 18:15:52 +0000 Subject: [PATCH] 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 --- .../src/main/resources/shiro.ini | 1 + .../com/arsdigita/cms/ui/FlatItemList.java | 91 +++--- .../cms/ui/folder/FolderBrowser.java | 144 ++++----- .../ui/folder/FolderBrowserController.java | 300 ++++++++++++++++++ .../FolderBrowserFilterFormModelBuilder.java | 73 +++++ .../FolderBrowserPaginationModelBuilder.java | 81 +++++ .../ui/folder/FolderBrowserTableModel.java | 95 ++++++ .../FolderBrowserTableModelBuilder.java | 89 ++++++ .../cms/ui/folder/FolderBrowserTableRow.java | 118 +++++++ .../org/librecms/contentsection/Folder.java | 75 ++++- .../com/arsdigita/bebop/SegmentedPanel.java | 52 +-- 11 files changed, 959 insertions(+), 160 deletions(-) create mode 100644 ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/FolderBrowserController.java create mode 100644 ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/FolderBrowserFilterFormModelBuilder.java create mode 100644 ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/FolderBrowserPaginationModelBuilder.java create mode 100644 ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/FolderBrowserTableModel.java create mode 100644 ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/FolderBrowserTableModelBuilder.java create mode 100644 ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/FolderBrowserTableRow.java diff --git a/ccm-bundle-devel-wildfly-web/src/main/resources/shiro.ini b/ccm-bundle-devel-wildfly-web/src/main/resources/shiro.ini index 968eec0b8..73ee402ca 100644 --- a/ccm-bundle-devel-wildfly-web/src/main/resources/shiro.ini +++ b/ccm-bundle-devel-wildfly-web/src/main/resources/shiro.ini @@ -8,3 +8,4 @@ ccmRealm = org.libreccm.security.CcmShiroRealm ccmRealm.credentialsMatcher = $passwordMatcher securityManager.realms = $ccmRealm +securityManager.rememberMeManager.cipherKey = p5h/Aphy0gfV+XThbEPqSG4iQNh2fTNH9ZEkSBAt/Ok= \ No newline at end of file diff --git a/ccm-cms/src/main/java/com/arsdigita/cms/ui/FlatItemList.java b/ccm-cms/src/main/java/com/arsdigita/cms/ui/FlatItemList.java index 4fb7ae1ad..7ed338065 100755 --- a/ccm-cms/src/main/java/com/arsdigita/cms/ui/FlatItemList.java +++ b/ccm-cms/src/main/java/com/arsdigita/cms/ui/FlatItemList.java @@ -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.addActionListener(this); - permissionActions.addAction(togglePrivateAction); +// 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); // 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() { @@ -347,21 +348,16 @@ public class FlatItemList extends SegmentedPanel implements FormProcessListener, if (!newItem) { 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 { diff --git a/ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/FolderBrowser.java b/ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/FolderBrowser.java index b179feb3f..9c6bc7803 100755 --- a/ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/FolderBrowser.java +++ b/ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/FolderBrowser.java @@ -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 subFolders = folder.getSubFolders(); + final List items = folder.getObjects() + .stream() + .map(categorization -> categorization.getCategorizedObject()) + .filter(object -> object instanceof ContentItem) + .map(object -> (ContentItem) object) + .collect(Collectors.toList()); + + final List 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); - - - /* - 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 query = criteriaBuilder. - createQuery(ContentItem.class); - final Root root = query.from(Categorization.class); - final Root itemRoot = query.from(ContentItem.class); - //final List predicates = new ArrayList<>(); - final Predicate categoryPredicate = criteriaBuilder.equal( - root.get("Categorization.category"), folder); - final Predicate typePredicate = criteriaBuilder.equal( - itemRoot.type(), ContentItem.class); - final List 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(); + throw new UnsupportedOperationException(); + } @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); } }; diff --git a/ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/FolderBrowserController.java b/ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/FolderBrowserController.java new file mode 100644 index 000000000..0b92295f0 --- /dev/null +++ b/ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/FolderBrowserController.java @@ -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 Jens Pelzetter + */ +@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 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 query = entityManager.createNamedQuery( + "Folder.countItems", Long.class); + query.setParameter("folder", folder); + query.setParameter("term", filterTerm); + + return query.getSingleResult(); + } + + public List findSubFolders(final Folder folder) { + return findSubFolders(folder, "%"); + } + + public List findSubFolders(final Folder folder, + final String filterTerm) { + final TypedQuery query = entityManager.createNamedQuery( + "Folder.findSubFolders", Folder.class); + query.setParameter("folder", folder); + query.setParameter("term", filterTerm); + + return query.getResultList(); + } + + public List findItems(final Folder folder) { + return findItems(folder, "%"); + } + + public List findItems(final Folder folder, + final int first, + final int maxResults) { + return findItems(folder, "%", first, maxResults); + } + + public List findItems(final Folder folder, + final String filterTerm) { + return findItems(folder, filterTerm, -1, -1); + } + + public List findItems(final Folder folder, + final String filterTerm, + final int first, + final int maxResults) { + final TypedQuery 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 findObjects(final Folder folder) { + return findObjects(folder, -1, -1); + } + + public List findObjects(final Folder folder, + final int first, + final int maxResults) { + return findObjects(folder, "%", first, maxResults); + } + + public List findObjects(final Folder folder, + final String filterTerm) { + return findObjects(folder, filterTerm, -1, -1); + } + + public List findObjects(final Folder folder, + final String filterTerm, + final int first, + final int maxResults) { + final TypedQuery 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 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 getObjectRows(final Folder folder) { + final List objects = findObjects(folder); + + return objects.stream() + .map(object -> buildRow(object)) + .collect(Collectors.toList()); + } + + @Transactional(Transactional.TxType.REQUIRED) + protected List getObjectRows(final Folder folder, + final String filterTerm) { + final List objects = findObjects(folder, + filterTerm); + + return objects.stream() + .map(object -> buildRow(object)) + .collect(Collectors.toList()); + } + + @Transactional(Transactional.TxType.REQUIRED) + protected List getObjectRows(final Folder folder, + final int first, + final int maxResults) { + final List objects = findObjects(folder, first, maxResults); + + return objects.stream() + .map(object -> buildRow(object)) + .collect(Collectors.toList()); + } + + @Transactional(Transactional.TxType.REQUIRED) + protected List getObjectRows(final Folder folder, + final String filterTerm, + final int first, + final int maxResults) { + final List 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 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; + } + +} diff --git a/ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/FolderBrowserFilterFormModelBuilder.java b/ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/FolderBrowserFilterFormModelBuilder.java new file mode 100644 index 000000000..557c6c112 --- /dev/null +++ b/ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/FolderBrowserFilterFormModelBuilder.java @@ -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 Jens Pelzetter + */ +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); + } + } + } + + + +} diff --git a/ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/FolderBrowserPaginationModelBuilder.java b/ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/FolderBrowserPaginationModelBuilder.java new file mode 100644 index 000000000..fd9b64b66 --- /dev/null +++ b/ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/FolderBrowserPaginationModelBuilder.java @@ -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 Jens Pelzetter + */ +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); + } + +} diff --git a/ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/FolderBrowserTableModel.java b/ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/FolderBrowserTableModel.java new file mode 100644 index 000000000..bc6bc3fc3 --- /dev/null +++ b/ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/FolderBrowserTableModel.java @@ -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 Jens Pelzetter + */ +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 iterator; + private FolderBrowserTableRow currentRow; + + public FolderBrowserTableModel(final List 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(); + } + +} diff --git a/ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/FolderBrowserTableModelBuilder.java b/ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/FolderBrowserTableModelBuilder.java new file mode 100644 index 000000000..8b0d94843 --- /dev/null +++ b/ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/FolderBrowserTableModelBuilder.java @@ -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 Jens Pelzetter + */ +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 rows; + if (filterTerm == null) { + rows = controller.getObjectRows(folder, first, pageSize); + } else { + rows = controller.getObjectRows(folder, filter, first, pageSize); + } + + + return new FolderBrowserTableModel(rows); + } + } + + + +} diff --git a/ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/FolderBrowserTableRow.java b/ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/FolderBrowserTableRow.java new file mode 100644 index 000000000..629ff8449 --- /dev/null +++ b/ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/FolderBrowserTableRow.java @@ -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 Jens Pelzetter + */ +class FolderBrowserTableRow { + + private long objectId; + private String objectUuid; + private String name; + private List 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 getLanguages() { + return Collections.unmodifiableList(languages); + } + + protected void setLanguages(final List 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; + } + + + +} diff --git a/ccm-cms/src/main/java/org/librecms/contentsection/Folder.java b/ccm-cms/src/main/java/org/librecms/contentsection/Folder.java index 80799a2fd..2efd01c11 100644 --- a/ccm-cms/src/main/java/org/librecms/contentsection/Folder.java +++ b/ccm-cms/src/main/java/org/librecms/contentsection/Folder.java @@ -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(); diff --git a/ccm-core/src/main/java/com/arsdigita/bebop/SegmentedPanel.java b/ccm-core/src/main/java/com/arsdigita/bebop/SegmentedPanel.java index 7c19d60a0..53beaef2d 100644 --- a/ccm-core/src/main/java/com/arsdigita/bebop/SegmentedPanel.java +++ b/ccm-core/src/main/java/com/arsdigita/bebop/SegmentedPanel.java @@ -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