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
ccm-docs
jensp 2017-02-11 18:15:52 +00:00
parent 1dd30646b3
commit aeca80a4ce
11 changed files with 959 additions and 160 deletions

View File

@ -8,3 +8,4 @@ ccmRealm = org.libreccm.security.CcmShiroRealm
ccmRealm.credentialsMatcher = $passwordMatcher ccmRealm.credentialsMatcher = $passwordMatcher
securityManager.realms = $ccmRealm 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_setHomeFolderAction;
// private final ActionLink m_removeHomeFolderAction; // private final ActionLink m_removeHomeFolderAction;
private final ActionLink createFolderAction; private final ActionLink createFolderAction;
private final ActionLink togglePrivateAction; // private final ActionLink togglePrivateAction;
// private final Label m_homeFolderLabel; // private final Label m_homeFolderLabel;
private final Segment browseSegment; private final Segment browseSegment;
private final Segment newItemSegment; private final Segment newItemSegment;
@ -245,28 +245,28 @@ public class FlatItemList extends SegmentedPanel implements FormProcessListener,
permissionActions.setSubject(permissionsPane); permissionActions.setSubject(permissionsPane);
// An action // An action
togglePrivateAction = new ActionLink(new Label(new PrintListener() { // togglePrivateAction = new ActionLink(new Label(new PrintListener() {
//
@Override // @Override
public void prepare(final PrintEvent event) { // public void prepare(final PrintEvent event) {
final PageState state = event.getPageState(); // final PageState state = event.getPageState();
final Label target = (Label) event.getTarget(); // final Label target = (Label) event.getTarget();
final Folder currentFolder = folderRequestLocal.getFolder(state); // final Folder currentFolder = folderRequestLocal.getFolder(state);
// ACSObject parent = currentFolder.getParent(); // // ACSObject parent = currentFolder.getParent();
//
// if (context == null) { //// if (context == null) {
target.setLabel(new GlobalizedMessage( // target.setLabel(new GlobalizedMessage(
"cms.ui.restore_default_permissions", // "cms.ui.restore_default_permissions",
CmsConstants.CMS_BUNDLE)); // CmsConstants.CMS_BUNDLE));
// } else { //// } else {
// target.setLabel(GlobalizationUtil //// target.setLabel(GlobalizationUtil
// .globalize("cms.ui.use_custom_permissions")); //// .globalize("cms.ui.use_custom_permissions"));
//// }
// } // }
} //
// }));
})); // togglePrivateAction.addActionListener(this);
togglePrivateAction.addActionListener(this); // permissionActions.addAction(togglePrivateAction);
permissionActions.addAction(togglePrivateAction);
// The 'new item' segment // The 'new item' segment
newItemSegment.addHeader(new Label(globalize("cms.ui.new_item"))); newItemSegment.addHeader(new Label(globalize("cms.ui.new_item")));
@ -305,12 +305,13 @@ public class FlatItemList extends SegmentedPanel implements FormProcessListener,
super.register(page); super.register(page);
page.setVisibleDefault(chooseLabel, false); page.setVisibleDefault(chooseLabel, false);
// page.setVisibleDefault(browseSegment, true);
page.setVisibleDefault(newItemSegment, false); page.setVisibleDefault(newItemSegment, false);
page.setVisibleDefault(newFolderSegment, false); page.setVisibleDefault(newFolderSegment, false);
page.setVisibleDefault(editFolderSegment, false); page.setVisibleDefault(editFolderSegment, false);
page page.addComponentStateParam(this,
.addComponentStateParam(this, typeSelectionModel.getStateParameter()); typeSelectionModel.getStateParameter());
page.addActionListener(new ActionListener() { page.addActionListener(new ActionListener() {
@ -348,20 +349,15 @@ public class FlatItemList extends SegmentedPanel implements FormProcessListener,
browseMode(state); browseMode(state);
} }
browseSegment.setVisible(state, true); createFolderAction.setVisible(state, newItem);
newItemForm.setVisible(state, newItem);
// newItemSegment.setVisible(state, newItem);
// newFolderSegment.setVisible(state, newItem);
//newItemForm.setVisible(state, newItem);
final boolean editItem = permissionChecker.isPermitted( final boolean editItem = permissionChecker.isPermitted(
ItemPrivileges.EDIT, folder); ItemPrivileges.EDIT, folder);
editFolderAction.setVisible(state, editItem); editFolderAction.setVisible(state, editItem);
chooseLabel.setVisible(state, editItem); // chooseLabel.setVisible(state, editItem);
editFolderSegment.setVisible(state, editItem); // editFolderSegment.setVisible(state, editItem);
if (permissionChecker.isPermitted(ItemPrivileges.ADMINISTER, folder)) { if (permissionChecker.isPermitted(ItemPrivileges.ADMINISTER, folder)) {
permissionsSegment.setVisible(state, true); permissionsSegment.setVisible(state, true);
@ -457,9 +453,10 @@ public class FlatItemList extends SegmentedPanel implements FormProcessListener,
} else if (source == editFolderAction) { } else if (source == editFolderAction) {
permissionsSegment.setVisible(state, false); permissionsSegment.setVisible(state, false);
editFolderSegment.setVisible(state, true); editFolderSegment.setVisible(state, true);
} else if (source == togglePrivateAction) {
togglePermissions(state);
} }
// else if (source == togglePrivateAction) {
// togglePermissions(state);
// }
// } else if (source == m_setHomeFolderAction) { // } else if (source == m_setHomeFolderAction) {
// User user = Web.getWebContext().getUser(); // User user = Web.getWebContext().getUser();
// Folder folder = m_folder.getFolder(state); // Folder folder = m_folder.getFolder(state);
@ -505,15 +502,15 @@ public class FlatItemList extends SegmentedPanel implements FormProcessListener,
return permissionsPane; return permissionsPane;
} }
public void setPermissionLinkVis(PageState state) { public void setPermissionLinkVis(final PageState state) {
final Folder currentFolder = folderRequestLocal.getFolder(state); // final Folder currentFolder = folderRequestLocal.getFolder(state);
final CdiUtil cdiUtil = CdiUtil.createCdiUtil(); // final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
final PermissionChecker permissionChecker = cdiUtil.findBean( // final PermissionChecker permissionChecker = cdiUtil.findBean(
PermissionChecker.class); // PermissionChecker.class);
if (!permissionChecker.isPermitted(ItemPrivileges.ADMINISTER, // if (!permissionChecker.isPermitted(ItemPrivileges.ADMINISTER,
currentFolder)) { // currentFolder)) {
togglePrivateAction.setVisible(state, false); // togglePrivateAction.setVisible(state, false);
} // }
} }
private static class SectionNewItemForm extends NewItemForm { 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.ContentItemRepository;
import org.librecms.contentsection.ContentSection; import org.librecms.contentsection.ContentSection;
import org.librecms.contentsection.ContentSectionManager; import org.librecms.contentsection.ContentSectionManager;
import org.librecms.contentsection.Folder;
import org.librecms.contentsection.privileges.ItemPrivileges; import org.librecms.contentsection.privileges.ItemPrivileges;
import org.librecms.dispatcher.ItemResolver; import org.librecms.dispatcher.ItemResolver;
import java.util.Date; import java.util.Date;
import java.util.stream.Collectors;
/** /**
* Browse folders and items. If the user clicks on a folder, the folder * 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; 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 private class FolderTableModelBuilder
extends AbstractTableModelBuilder extends AbstractTableModelBuilder
implements PaginationModelBuilder, implements PaginationModelBuilder,
@ -269,9 +283,10 @@ public class FolderBrowser extends Table {
private final FolderSelectionModel folderModel; private final FolderSelectionModel folderModel;
private final FolderBrowser folderBrowser; private final FolderBrowser folderBrowser;
private final ContentItemRepository itemRepo; // private final ContentItemRepository itemRepo;
private final ConfigurationManager confManager; // private final ConfigurationManager confManager;
private final ContentSectionManager sectionManager; // private final ContentSectionManager sectionManager;
final FolderBrowserController controller;
public FolderTableModelBuilder(final FolderSelectionModel folderModel) { public FolderTableModelBuilder(final FolderSelectionModel folderModel) {
this(folderModel, null); this(folderModel, null);
@ -282,99 +297,54 @@ public class FolderBrowser extends Table {
this.folderModel = folderModel; this.folderModel = folderModel;
this.folderBrowser = folderBrowser; this.folderBrowser = folderBrowser;
final CdiUtil cdiUtil = CdiUtil.createCdiUtil(); final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
itemRepo = cdiUtil.findBean(ContentItemRepository.class); controller = cdiUtil.findBean(FolderBrowserController.class);
confManager = cdiUtil.findBean(ConfigurationManager.class); // itemRepo = cdiUtil.findBean(ContentItemRepository.class);
sectionManager = cdiUtil.findBean(ContentSectionManager.class); // confManager = cdiUtil.findBean(ConfigurationManager.class);
// sectionManager = cdiUtil.findBean(ContentSectionManager.class);
} }
@Override @Override
public TableModel makeModel(final Table table, final PageState state) { 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. throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
} }
@Override @Override
public int getTotalSize(final Paginator paginator, public int getTotalSize(final Paginator paginator,
final PageState state) { final PageState state) {
final Category folder = (Category) folderModel.getSelectedObject( throw new UnsupportedOperationException();
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<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 @Override
public boolean isVisible(final PageState state) { 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 @Override
public long getFolderSize(final PageState state) { public long getFolderSize(final PageState state) {
return itemRepo.countItemsInFolder((Category) folderModel. throw new UnsupportedOperationException();
getSelectedObject(state));
} }
} }
@ -382,21 +352,23 @@ public class FolderBrowser extends Table {
private class HeaderCellRenderer private class HeaderCellRenderer
extends com.arsdigita.cms.ui.util.DefaultTableCellRenderer { 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); super(true);
m_key = key; this.headerKey = headerKey;
} }
@Override @Override
public Component getComponent(final Table table, final PageState state, public Component getComponent(final Table table, final PageState state,
Object value, final Object value,
boolean isSelected, Object key, boolean isSelected,
int row, int column) { final Object key,
final int row,
final int column) {
String headerName = (String) ((GlobalizedMessage) value).localize(); String headerName = (String) ((GlobalizedMessage) value).localize();
String sortKey = (String) state.getValue(m_sortType); 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( final String currentSortDirection = (String) state.getValue(
m_sortDirection); m_sortDirection);
String imageURLStub; String imageURLStub;
@ -422,7 +394,7 @@ public class FolderBrowser extends Table {
} }
ps.setControlEvent(table, ps.setControlEvent(table,
sortDirectionAction, 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.categorization.Category;
import org.libreccm.core.CcmObject; import org.libreccm.core.CcmObject;
import org.librecms.CmsConstants;
import java.io.Serializable; import java.io.Serializable;
import java.util.Collections; import java.util.Collections;
@ -59,6 +60,79 @@ import static org.librecms.CmsConstants.*;
@NamedQuery( @NamedQuery(
name = "Folder.findByName", name = "Folder.findByName",
query = "SELECT f FROM Folder f WHERE f.name = :name") 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 { public class Folder extends Category implements Serializable {
@ -115,7 +189,6 @@ public class Folder extends Category implements Serializable {
// return (Folder) getParentCategory(); // return (Folder) getParentCategory();
// } // }
// } // }
@Override @Override
public int hashCode() { public int hashCode() {
int hash = super.hashCode(); int hash = super.hashCode();

View File

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