From 502c0e0416a528ff1e299c608d5021d89643b642 Mon Sep 17 00:00:00 2001 From: jensp Date: Fri, 17 Feb 2017 13:55:21 +0000 Subject: [PATCH] CCM NG/ccm-cms: BrowsePane Expanding/collapsing of the folder on the left. git-svn-id: https://svn.libreccm.org/ccm/ccm_ng@4580 8810af33-2d31-482b-a856-94f89814c4df --- .../src/main/resources/log4j2.xml | 6 +- .../cms/ui/folder/FolderBrowser.java | 111 +++++--- .../ui/folder/FolderBrowserController.java | 48 ++++ .../ui/folder/FolderBrowserTableModel.java | 26 +- .../FolderBrowserTableModelBuilder.java | 13 +- .../cms/ui/folder/FolderBrowserTableRow.java | 49 +++- .../cms/ui/folder/FolderManipulator.java | 264 +++++++++--------- .../cms/ui/folder/FolderTreeModelBuilder.java | 19 +- .../ui/folder/FolderTreeModelController.java | 7 +- .../librecms/contentsection/ContentItem.java | 22 +- .../librecms/contentsection/ContentType.java | 7 +- .../org/librecms/contentsection/Folder.java | 3 - .../org/librecms/CmsResources.properties | 1 + .../org/librecms/CmsResources_de.properties | 1 + .../org/librecms/CmsResources_fr.properties | 1 + .../com/arsdigita/bebop/tree/TreeModel.java | 2 +- .../arsdigita/ui/CcmObjectSelectionModel.java | 9 +- .../security/RoleMembershipMarshaller.java | 8 +- 18 files changed, 369 insertions(+), 228 deletions(-) diff --git a/ccm-bundle-devel-wildfly-web/src/main/resources/log4j2.xml b/ccm-bundle-devel-wildfly-web/src/main/resources/log4j2.xml index 853a794c1..88e77939f 100644 --- a/ccm-bundle-devel-wildfly-web/src/main/resources/log4j2.xml +++ b/ccm-bundle-devel-wildfly-web/src/main/resources/log4j2.xml @@ -10,7 +10,7 @@ - + --> + + locale.toString()) - .map((lang) -> { - final StringBuilder fontWeight = new StringBuilder(2); - final StringBuilder styleClasses = new StringBuilder(20); - if (itemManager.isLive(item)) { - fontWeight.append(Label.BOLD); - styleClasses.append("live "); - } - final Label langLabel = new Label(lang); - langLabel.setFontWeight(fontWeight.toString().trim()); - langLabel.setClassAttr(styleClasses.toString().trim()); - return langLabel; - }) - .forEach((langLabel) -> { - container.add(new Link( - langLabel, - itemResolver.generateItemURL(state, - item.getObjectId(), - name, - section, - item.getVersion().name()))); - }); +// item.getName().getAvailableLocales().stream() +// .map((locale) -> locale.toString()) +// .map((lang) -> { +// final StringBuilder fontWeight = new StringBuilder(2); +// final StringBuilder styleClasses = new StringBuilder(20); +// if (itemManager.isLive(item)) { +// fontWeight.append(Label.BOLD); +// styleClasses.append("live "); +// } +// final Label langLabel = new Label(lang); +// langLabel.setFontWeight(fontWeight.toString().trim()); +// langLabel.setClassAttr(styleClasses.toString().trim()); +// return langLabel; +// }) +// .forEach((langLabel) -> { +// container.add(new Link( +// langLabel, +// itemResolver.generateItemURL(state, +// item.getObjectId(), +// name, +// section, +// item.getVersion().name()))); +// }); + @SuppressWarnings("unchecked") + final List availableLocales = (List) value; + availableLocales.forEach(locale -> container.add(new Link( + new Text(locale.toString()), + itemResolver.generateItemURL(state, + (long) key, + locale.toString(), + section, + "DRAFT")))); return container; } @@ -803,5 +825,4 @@ public class FolderBrowser extends Table { } - } 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 index 3f86e3b29..6e3623b98 100644 --- 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 @@ -20,19 +20,26 @@ package com.arsdigita.cms.ui.folder; import com.arsdigita.kernel.KernelConfig; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; import org.libreccm.configuration.ConfigurationManager; import org.libreccm.core.CcmObject; import org.libreccm.core.CcmObjectRepository; import org.libreccm.l10n.GlobalizationHelper; import org.libreccm.l10n.LocalizedString; +import org.librecms.CmsConstants; import org.librecms.contentsection.ContentItem; import org.librecms.contentsection.ContentItemL10NManager; +import org.librecms.contentsection.ContentType; import org.librecms.contentsection.Folder; +import org.librecms.contenttypes.ContentTypeInfo; +import org.librecms.contenttypes.ContentTypesManager; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Locale; +import java.util.Objects; import java.util.Optional; import java.util.stream.Collectors; @@ -50,6 +57,9 @@ import javax.transaction.Transactional; @RequestScoped public class FolderBrowserController { + private static final Logger LOGGER = LogManager.getLogger( + FolderBrowserController.class); + @Inject private EntityManager entityManager; @@ -64,6 +74,9 @@ public class FolderBrowserController { @Inject private ContentItemL10NManager itemL10NManager; + + @Inject + private ContentTypesManager typesManager; private Locale defaultLocale; @@ -166,6 +179,37 @@ public class FolderBrowserController { final String filterTerm, final int first, final int maxResults) { + + Objects.requireNonNull(folder); + LOGGER.debug("Trying to find objects in folder {}...", + Objects.toString(folder)); + +// final TypedQuery testQuery1 = entityManager.createQuery( +// "SELECT f FROM Folder f " +// + "WHERE f.parentCategory = :folder " +// + "AND LOWER(f.name) LIKE :term", +// CcmObject.class); +// testQuery1.setParameter("folder", folder); +// testQuery1.setParameter("term", filterTerm); +// final List testResult1 = testQuery1.getResultList(); +// LOGGER.debug("TestResult1: {}", +// Objects.toString(testResult1)); +// +// final TypedQuery testQuery2 = entityManager.createQuery( +// "SELECT i FROM ContentItem i JOIN i.categories c " +// + "WHERE c.category = :folder " +// + "AND c.type = '" + CmsConstants.CATEGORIZATION_TYPE_FOLDER +// + "' " +// + "AND i.version = " +// + "org.librecms.contentsection.ContentItemVersion.DRAFT " +// + "AND (LOWER(i.displayName) LIKE LOWER(:term))", +// CcmObject.class); +// testQuery2.setParameter("folder", folder); +// testQuery2.setParameter("term", filterTerm); +// final List testResult2 = testQuery2.getResultList(); +// LOGGER.debug("TestResult2: {}", +// Objects.toString(testResult2)); + final TypedQuery query = entityManager.createNamedQuery( "Folder.findObjects", CcmObject.class); query.setParameter("folder", folder); @@ -272,6 +316,10 @@ public class FolderBrowserController { } else { row.setTitle(item.getTitle().getValue(defaultLocale)); } + final ContentType type = item.getContentType(); + final ContentTypeInfo typeInfo = typesManager.getContentTypeInfo(type); + row.setTypeLabelBundle(typeInfo.getLabelBundle()); + row.setTypeLabelKey(typeInfo.getLabelKey()); } else { row.setObjectId(object.getObjectId()); row.setObjectUuid(object.getUuid()); 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 index bc6bc3fc3..c01c9a5a2 100644 --- 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 @@ -19,6 +19,9 @@ package com.arsdigita.cms.ui.folder; import com.arsdigita.bebop.table.TableModel; +import com.arsdigita.globalization.GlobalizedMessage; + +import org.librecms.CmsConstants; import java.util.Iterator; import java.util.List; @@ -27,9 +30,9 @@ import javax.ws.rs.DELETE; /** * Table model for the {@link FolderBrowser}. - * + * * @see {FolderBrowserTableModelBuilder} - * + * * @author Jens Pelzetter */ class FolderBrowserTableModel implements TableModel { @@ -41,14 +44,14 @@ class FolderBrowserTableModel implements TableModel { 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; @@ -66,7 +69,7 @@ class FolderBrowserTableModel implements TableModel { @Override public Object getElementAt(final int columnIndex) { - switch(columnIndex) { + switch (columnIndex) { case COL_NAME: return currentRow.getName(); case COL_LANGUAGES: @@ -74,7 +77,14 @@ class FolderBrowserTableModel implements TableModel { case COL_TITLE: return currentRow.getTitle(); case COL_TYPE: - return currentRow.getType(); + final String typeLabelBundle = currentRow.getTypeLabelBundle(); + final String typeLabelKey = currentRow.getTypeLabelKey(); + if (typeLabelKey == null) { + return new GlobalizedMessage("empty_text", + CmsConstants.CMS_BUNDLE); + } else { + return new GlobalizedMessage(typeLabelKey, typeLabelBundle); + } case COL_CREATION_DATE: return currentRow.getCreated(); case COL_LAST_MODIFIED: @@ -91,5 +101,5 @@ class FolderBrowserTableModel implements TableModel { 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 index 82515b179..e59417a0d 100644 --- 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 @@ -25,6 +25,8 @@ import com.arsdigita.bebop.table.TableModel; import com.arsdigita.bebop.table.TableModelBuilder; import com.arsdigita.util.LockableImpl; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; import org.libreccm.cdi.utils.CdiUtil; import org.librecms.contentsection.Folder; @@ -37,6 +39,8 @@ import java.util.List; class FolderBrowserTableModelBuilder extends LockableImpl implements TableModelBuilder { + private final static Logger LOGGER = LogManager.getLogger(FolderBrowserTableModelBuilder.class); + @Override public TableModel makeModel(final Table table, final PageState state) { @@ -70,14 +74,17 @@ class FolderBrowserTableModelBuilder extends LockableImpl filterTerm = null; } + final long start = System.currentTimeMillis(); + LOGGER.debug("Retrieving table rows..."); final List rows; if (filterTerm == null) { - rows = controller.getObjectRows(folder, first, pageSize); + rows = controller.getObjectRows(folder, first -1, pageSize); } else { - rows = controller.getObjectRows(folder, filter, first, pageSize); + rows = controller.getObjectRows(folder, filter, first- 1, pageSize); } - + LOGGER.debug("Retrieve table rows in {} ms.", + System.currentTimeMillis() - start); 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 index 629ff8449..6cf4508a5 100644 --- 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 @@ -30,13 +30,14 @@ 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 String typeLabelBundle; + private String typeLabelKey; private Date created; private Date lastModified; private boolean deletable; @@ -81,28 +82,52 @@ class FolderBrowserTableRow { this.title = title; } - public String getType() { - return type; + public String getTypeLabelBundle() { + return typeLabelBundle; + } + + protected void setTypeLabelBundle(final String typeLabelBundle) { + this.typeLabelBundle = typeLabelBundle; + } + + public String getTypeLabelKey() { + return typeLabelKey; } - protected void setType(final String type) { - this.type = type; + protected void setTypeLabelKey(final String typeLabelKey) { + this.typeLabelKey = typeLabelKey; } public Date getCreated() { - return new Date(created.getTime()); + if (created == null) { + return null; + } else { + return new Date(created.getTime()); + } } protected void setCreated(final Date created) { - this.created = new Date(created.getTime()); + if (created == null) { + this.created = null; + } else { + this.created = new Date(created.getTime()); + } } public Date getLastModified() { - return new Date(lastModified.getTime()); + if (lastModified == null) { + return null; + } else { + return new Date(lastModified.getTime()); + } } protected void setLastModified(final Date lastModified) { - this.lastModified = new Date(lastModified.getTime()); + if (lastModified == null) { + this.lastModified = null; + } else { + this.lastModified = new Date(lastModified.getTime()); + } } public boolean isDeletable() { @@ -112,7 +137,5 @@ class FolderBrowserTableRow { protected void setDeletable(final boolean deletable) { this.deletable = deletable; } - - - + } diff --git a/ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/FolderManipulator.java b/ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/FolderManipulator.java index 4ac86fbd4..7a4b79854 100755 --- a/ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/FolderManipulator.java +++ b/ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/FolderManipulator.java @@ -37,6 +37,7 @@ import com.arsdigita.bebop.Resettable; import com.arsdigita.bebop.SaveCancelSection; import com.arsdigita.bebop.SimpleContainer; import com.arsdigita.bebop.Table; +import com.arsdigita.bebop.Text; import com.arsdigita.bebop.Tree; import com.arsdigita.bebop.event.ActionEvent; import com.arsdigita.bebop.event.ActionListener; @@ -110,11 +111,11 @@ public class FolderManipulator extends SimpleContainer implements //public static final String RESOURCE_BUNDLE = "com.arsdigita.cms.ui.folder.CMSFolderResources"; private static final Logger LOGGER = LogManager.getLogger( FolderManipulator.class); - + private static final String ATOZ_FILTER_PARAM = "aToZfilter"; private static final String ACTION_PARAM = "act"; private static final String FILTER_PARAM = "filter"; - + private static final String SOURCES_PARAM = "srcs"; private static final String MOVE = "Move"; private static final String COPY = "Copy"; @@ -139,17 +140,17 @@ public class FolderManipulator extends SimpleContainer implements ATOZ_FILTER_PARAM); private final StringParameter filterParam = new StringParameter(FILTER_PARAM); - + public FolderManipulator(final FolderSelectionModel folderModel) { - + super(); - + sourceFolderModel = folderModel; itemView = new ItemView(); itemView.addProcessListener(new ItemViewProcessListener()); itemView.addValidationListener(new ItemViewValidationListener()); add(itemView); - + targetSelector.addProcessListener(new TargetSelectorProcessListener()); targetSelector.addValidationListener( new TargetSelectorValidationListener()); @@ -159,10 +160,10 @@ public class FolderManipulator extends SimpleContainer implements //publishDialog.addProcessListener(new PublishDialogProcessListener()); } - + @Override public void register(final Page page) { - + super.register(page); page.setVisibleDefault(targetSelector, false); page.setVisibleDefault(filterForm, true); @@ -170,11 +171,11 @@ public class FolderManipulator extends SimpleContainer implements page.addComponentStateParam(this, actionParam); page.addComponentStateParam(this, atozFilterParam); page.addComponentStateParam(this, filterParam); - + } - + public final Long[] getSources(final PageState state) { - + final Long[] result = (Long[]) state.getValue(sourcesParam); //Return empty array instead of null. @@ -184,19 +185,19 @@ public class FolderManipulator extends SimpleContainer implements return result; } } - + public final FolderSelectionModel getSourceFolderModel() { return sourceFolderModel; } - + public final Category getTarget(final PageState state) { return targetSelector.getTarget(state); } - + protected final boolean isMove(final PageState state) { return MOVE.equals(getAction(state)); } - + protected final boolean isCopy(final PageState state) { return COPY.equals(getAction(state)); } @@ -211,18 +212,18 @@ public class FolderManipulator extends SimpleContainer implements private String getAction(final PageState state) { return (String) state.getValue(actionParam); } - + protected void moveItems(final Category target, final Long[] itemIds) { - + for (Long itemId : itemIds) { - + changeItemParent(itemId, target); - + } - + } - + private void changeItemParent(final Long itemId, final Category newParent) { //ToDo @@ -241,7 +242,7 @@ public class FolderManipulator extends SimpleContainer implements // item.setParent(newParent); // item.save(); } - + protected void copyItems(final Category target, final Long[] itemIds) { @@ -423,53 +424,53 @@ public class FolderManipulator extends SimpleContainer implements public final FolderBrowser getBrowser() { return itemView.getBrowser(); } - + private class ItemViewProcessListener implements FormProcessListener { - + public ItemViewProcessListener() { //Nothing } - + @Override public void process(final FormSectionEvent event) throws FormProcessException { final PageState state = event.getPageState(); - + itemView.setVisible(state, false); targetSelector.setVisible(state, true); targetSelector.expose(state); } - + } - + private class TargetSelectorProcessListener implements FormProcessListener { - + public TargetSelectorProcessListener() { //Nothing } - + @Override public void process(final FormSectionEvent event) throws FormProcessException { - + final PageState state = event.getPageState(); - + itemView.setVisible(state, true); targetSelector.setVisible(state, false); - + final Category folder = targetSelector.getTarget(state); final Long[] itemIds = getSources(state); - + if (isCopy(state)) { copyItems(folder, itemIds); } else if (isMove(state)) { moveItems(folder, itemIds); } - + reset(state); - + } - + } // private class PublishDialogProcessListener implements FormProcessListener { @@ -499,43 +500,43 @@ public class FolderManipulator extends SimpleContainer implements // // } private class ItemViewValidationListener implements FormValidationListener { - + public ItemViewValidationListener() { //Nothing } - + @Override public void validate(final FormSectionEvent event) throws FormProcessException { - + final PageState state = event.getPageState(); final FormData data = event.getFormData(); - + if (getSources(state).length <= 0) { data.addError("cms.ui.folder.must_select_item", CmsConstants.CMS_FOLDER_BUNDLE); } } - + } - + private class TargetSelectorValidationListener implements FormValidationListener { - + public TargetSelectorValidationListener() { //Nothing } - + @Override public void validate(final FormSectionEvent event) throws FormProcessException { - + final PageState state = event.getPageState(); - + if (getSources(state).length <= 0) { throw new IllegalStateException("No source items specified"); } - + final Category target = targetSelector.getTarget(state); final FormData data = event.getFormData(); if (target == null) { @@ -545,7 +546,7 @@ public class FolderManipulator extends SimpleContainer implements //If the target is null, we can skip the rest of the checks return; } - + if (target.equals(sourceFolderModel.getSelectedObject(state))) { data.addError(new GlobalizedMessage( "cms.ui.folder.not_within_same_folder", @@ -562,15 +563,15 @@ public class FolderManipulator extends SimpleContainer implements data.addError("cms.ui.folder.no_permission_for_item", CmsConstants.CMS_FOLDER_BUNDLE); } - + for (Long source : getSources(state)) { - + validateItem(source, target, state, data); - + } - + } - + private void validateItem(final Long itemId, final Category target, final PageState state, @@ -582,20 +583,20 @@ public class FolderManipulator extends SimpleContainer implements ContentItemManager.class); final PermissionChecker permissionChecker = cdiUtil.findBean( PermissionChecker.class); - + final ContentItem item = itemRepo.findById(itemId).get(); final String name = item.getDisplayName(); - + final long count = itemRepo.countByNameInFolder(target, name); if (count > 0) { // there is an item in the target folder that already has this name addErrorMessage(data, "cms.ui.folder.item_already_exists", name); } - + if (itemManager.isLive(item) && isMove(state)) { addErrorMessage(data, "cms.ui.folder.item_is_live", name); } - + if (!(permissionChecker.isPermitted( ItemPrivileges.DELETE, item)) && isMove(state)) { @@ -603,9 +604,9 @@ public class FolderManipulator extends SimpleContainer implements name); } } - + } - + private void addErrorMessage(final FormData data, final String message, final String itemName) { @@ -627,31 +628,31 @@ public class FolderManipulator extends SimpleContainer implements // } private class TargetSelectorSubmissionListener implements FormSubmissionListener { - + public TargetSelectorSubmissionListener() { //Nothing } - + @Override public void submitted(final FormSectionEvent event) throws FormProcessException { - + final PageState state = event.getPageState(); - + if (targetSelector.isCancelled(state)) { reset(state); throw new FormProcessException(new GlobalizedMessage( "cms.ui.folder.cancelled", CmsConstants.CMS_FOLDER_BUNDLE)); } - + } - + } - + @Override public void reset(final PageState state) { - + itemView.setVisible(state, true); itemView.reset(state); targetSelector.setVisible(state, false); @@ -661,25 +662,25 @@ public class FolderManipulator extends SimpleContainer implements state.setValue(sourcesParam, null); //s.setValue(m_aToZfilter, null); state.setValue(filterParam, null); - + } // The form containing the tree to select the target folder from private class TargetSelector extends Form implements Resettable { - + private final FolderSelectionModel targetModel; private final FolderTree folderTree; private final Submit cancelButton; - + public TargetSelector() { super("targetSel", new BoxPanel()); setMethod(GET); targetModel = new FolderSelectionModel("target"); folderTree = new FolderTree(targetModel); folderTree.setCellRenderer(new FolderTreeCellRenderer()); - + final Label label = new Label(new PrintListener() { - + @Override public void prepare(final PrintEvent event) { final PageState state = event.getPageState(); @@ -690,9 +691,9 @@ public class FolderManipulator extends SimpleContainer implements final CdiUtil cdiUtil = CdiUtil.createCdiUtil(); final CategoryManager categoryManager = cdiUtil. findBean(CategoryManager.class); - + if (isMove(state)) { - + label.setLabel(new GlobalizedMessage( "cms.ui.folder.move", CmsConstants.CMS_FOLDER_BUNDLE, @@ -707,9 +708,9 @@ public class FolderManipulator extends SimpleContainer implements folder)})); } } - + }); - + label.setOutputEscaping(false); add(label); add(folderTree); @@ -718,7 +719,7 @@ public class FolderManipulator extends SimpleContainer implements cancelButton = saveCancelSection.getCancelButton(); add(saveCancelSection); } - + @Override public void register(final Page page) { super.register(page); @@ -744,7 +745,7 @@ public class FolderManipulator extends SimpleContainer implements // items.close(); } } - + @Override public void reset(final PageState state) { folderTree.clearSelection(state); @@ -753,15 +754,15 @@ public class FolderManipulator extends SimpleContainer implements state.setValue(folderTree.getSelectionModel().getStateParameter(), null); } - + public Category getTarget(final PageState state) { return (Category) targetModel.getSelectedObject(state); } - + public boolean isCancelled(final PageState state) { return cancelButton.isSelected(state); } - + } //The form which is show for the publish and unpublish action @@ -805,26 +806,26 @@ public class FolderManipulator extends SimpleContainer implements // The form containing the browser and the drop down for selecting an // action private class ItemView extends Form implements Resettable { - + private static final String ITEM_VIEW = "itemView"; - + private final FolderBrowser folderBrowser; private final Paginator paginator; private final OptionGroup checkboxGroup; private final SingleSelect actionSelect; private final Submit submit; - + public ItemView() { - + super(ITEM_VIEW, new SimpleContainer()); setMethod(GET); - + final ActionGroup group = new ActionGroup(); add(group); - + final GridPanel panel = new GridPanel(1); group.setSubject(panel); - + folderBrowser = new FolderBrowser(sourceFolderModel); folderBrowser.setAtoZfilterParameter(atozFilterParam); folderBrowser.setFilterParameter(filterParam); @@ -836,20 +837,20 @@ public class FolderManipulator extends SimpleContainer implements folderBrowser.setPaginator(paginator); panel.add(paginator); panel.add(folderBrowser); - + LOGGER.debug("Adding filter form..."); filterForm = new FilterForm(new FolderBrowserFilterFormModelBuilder( folderBrowser)); FolderManipulator.this.add(filterForm); - + checkboxGroup = new CheckboxGroup(sourcesParam); panel.add(checkboxGroup); - + panel.add(new FormErrorDisplay(this)); - + final Container container = new SimpleContainer(); group.addAction(container); - + container.add(new Label(new GlobalizedMessage( "cms.ui.folder.edit_selection", CmsConstants.CMS_FOLDER_BUNDLE))); @@ -882,21 +883,23 @@ public class FolderManipulator extends SimpleContainer implements // Add a new first column to the table final TableColumn column = new TableColumn(); + column.setHeaderValue(new GlobalizedMessage("empty_text", + CmsConstants.CMS_BUNDLE)); column.setCellRenderer(new CheckboxRenderer()); folderBrowser.getColumnModel().add(0, column); } - + public final FolderBrowser getBrowser() { return folderBrowser; } - + public Paginator getPaginator() { return paginator; } - + @Override public void reset(final PageState state) { - + checkboxGroup.setValue(state, null); actionSelect.setValue(state, null); paginator.reset(state); @@ -907,11 +910,11 @@ public class FolderManipulator extends SimpleContainer implements // The renderer for the first column in the itemView table private class CheckboxRenderer implements TableCellRenderer { - + public CheckboxRenderer() { //Nothing to do } - + @Override public Component getComponent(final Table table, final PageState state, @@ -920,50 +923,49 @@ public class FolderManipulator extends SimpleContainer implements final Object key, final int row, final int column) { - final BigDecimal n = (BigDecimal) key; - Option result = new Option(sourcesParam.marshalElement(n.abs()), - ""); + final Option result = new Option(key.toString(), + new Text("")); result.setGroup(checkboxGroup); return result; } - + } - + } - + protected class FilterForm extends Form implements FormProcessListener, FormInitListener, FormSubmissionListener { - + private final SimpleContainer panel; private boolean visible; private final FilterFormModelBuilder modelBuilder; private final TextField filterField; - + public FilterForm(final FilterFormModelBuilder modelBuilder) { super("folderFilterForm"); - + LOGGER.debug("Creating filter form..."); - + this.modelBuilder = modelBuilder; - + addProcessListener(this); addInitListener(this); addSubmissionListener(this); - + panel = new BoxPanel(BoxPanel.HORIZONTAL); - + final ActionLink allLink = new ActionLink( new GlobalizedMessage("cms.ui.folder.filter.all", CmsConstants.CMS_FOLDER_BUNDLE)); allLink.addActionListener(new ActionListener() { - + @Override public void actionPerformed(final ActionEvent event) { //event.getPageState().setValue(m_aToZfilter, ""); event.getPageState().setValue(filterParam, ""); } - + }); panel.add(allLink); @@ -989,33 +991,33 @@ public class FolderManipulator extends SimpleContainer implements new GlobalizedMessage( "cms.ui.folder.filter_do", CmsConstants.CMS_FOLDER_BUNDLE))); - + add(panel); - + } - + public TextField getFilterField() { return filterField; } - + @Override public void process(final FormSectionEvent event) throws FormProcessException { //Nothing } - + @Override public void init(final FormSectionEvent event) throws FormProcessException { //fse.getPageState().setValue(FolderManipulator.this.m_filter, null); //filterField.setValue(fse.getPageState(), null); } - + @Override public void submitted(final FormSectionEvent event) throws FormProcessException { } - + @Override public boolean isVisible(PageState state) { if (super.isVisible(state) @@ -1027,13 +1029,13 @@ public class FolderManipulator extends SimpleContainer implements return false; } } - + } - + protected interface FilterFormModelBuilder { - + public long getFolderSize(PageState state); - + } /** @@ -1051,7 +1053,7 @@ public class FolderManipulator extends SimpleContainer implements // return new GlobalizedMessage(key, RESOURCE_BUNDLE, args); // } private class FolderTreeCellRenderer implements TreeCellRenderer { - + private RequestLocal m_invalidFolders = new RequestLocal(); /** @@ -1119,7 +1121,7 @@ public class FolderManipulator extends SimpleContainer implements // m_invalidFolders.set(state, invalidFolders); // } final Label label = new Label(value.toString()); - + if (invalidFolders.contains(key.toString())) { return label; } @@ -1129,10 +1131,10 @@ public class FolderManipulator extends SimpleContainer implements label.setFontWeight(Label.BOLD); return label; } - + return new ControlLink(label); } - + } - + } diff --git a/ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/FolderTreeModelBuilder.java b/ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/FolderTreeModelBuilder.java index 6c0be452f..b65d981a8 100755 --- a/ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/FolderTreeModelBuilder.java +++ b/ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/FolderTreeModelBuilder.java @@ -24,6 +24,7 @@ import com.arsdigita.bebop.tree.TreeModel; import com.arsdigita.bebop.tree.TreeModelBuilder; import com.arsdigita.bebop.tree.TreeNode; import com.arsdigita.cms.CMS; +import com.arsdigita.ui.admin.applications.ApplicationInstanceTreeNode; import org.librecms.contentsection.ContentSection; @@ -35,6 +36,9 @@ import java.util.Iterator; import org.libreccm.cdi.utils.CdiUtil; import org.librecms.contentsection.Folder; +import java.util.List; +import java.util.stream.Collectors; + /** * A {@link com.arsdigita.bebop.tree.TreeModelBuilder} that produces trees * containing the folder structure underneath a root folder. The root folder can @@ -77,7 +81,7 @@ public class FolderTreeModelBuilder extends LockableImpl } @Override - public Iterator getChildren(final TreeNode node, + public Iterator getChildren(final TreeNode node, final PageState state) { final String nodeKey = node.getKey().toString(); @@ -95,10 +99,21 @@ public class FolderTreeModelBuilder extends LockableImpl final FolderTreeModelController controller = cdiUtil.findBean( FolderTreeModelController.class); - return controller.getChildren(node); + final List subFolders = controller.getChildren(node); + return subFolders.stream() + .map(folder -> generateTreeNode(folder)) + .collect(Collectors.toList()) + .iterator(); } + private TreeNode generateTreeNode(final Folder folder) { + final FolderTreeNode node = new FolderTreeNode(folder); + + return node; + } }; + + /*return new DataQueryTreeModel(getRoot(state).getID(), "com.arsdigita.cms.getRootFolder", diff --git a/ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/FolderTreeModelController.java b/ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/FolderTreeModelController.java index 10f9afeed..e3da4068d 100644 --- a/ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/FolderTreeModelController.java +++ b/ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/FolderTreeModelController.java @@ -24,6 +24,7 @@ import org.librecms.contentsection.Folder; import org.librecms.contentsection.FolderRepository; import java.util.Iterator; +import java.util.List; import java.util.Optional; import javax.enterprise.context.RequestScoped; @@ -62,12 +63,12 @@ public class FolderTreeModelController { @Transactional(Transactional.TxType.REQUIRED) public boolean hasChildren(final TreeNode node) { - return getCurrentFolder(node).getSubCategories().isEmpty(); + return !getCurrentFolder(node).getSubCategories().isEmpty(); } @Transactional(Transactional.TxType.REQUIRED) - public Iterator getChildren(final TreeNode node) { - return getCurrentFolder(node).getSubFolders().iterator(); + public List getChildren(final TreeNode node) { + return getCurrentFolder(node).getSubFolders(); } } diff --git a/ccm-cms/src/main/java/org/librecms/contentsection/ContentItem.java b/ccm-cms/src/main/java/org/librecms/contentsection/ContentItem.java index cf4bf2b62..ef34e1ece 100644 --- a/ccm-cms/src/main/java/org/librecms/contentsection/ContentItem.java +++ b/ccm-cms/src/main/java/org/librecms/contentsection/ContentItem.java @@ -55,6 +55,8 @@ import javax.persistence.TemporalType; import org.hibernate.search.annotations.IndexedEmbedded; +import javax.persistence.FetchType; + import static org.librecms.CmsConstants.*; /** @@ -187,7 +189,7 @@ public class ContentItem extends CcmObject implements Serializable { /** * The content type associated with the content item. */ - @OneToOne + @OneToOne(fetch = FetchType.LAZY) @JoinColumn(name = "CONTENT_TYPE_ID") @Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED) // @Field @@ -245,15 +247,15 @@ public class ContentItem extends CcmObject implements Serializable { @Column(name = "ANCESTORS", length = 1024) private String ancestors; - @OneToMany(mappedBy = "item") + @OneToMany(mappedBy = "item", fetch = FetchType.LAZY) private List attachments; - @OneToOne + @OneToOne() @JoinColumn(name = "LIFECYCLE_ID") @Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED) private Lifecycle lifecycle; - @OneToOne + @OneToOne(fetch = FetchType.LAZY) @JoinColumn(name = "WORKFLOW_ID") @Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED) private Workflow workflow; @@ -379,7 +381,7 @@ public class ContentItem extends CcmObject implements Serializable { int hash = super.hashCode(); hash = 59 * hash + Objects.hashCode(itemUuid); hash = 59 * hash + Objects.hashCode(name); - hash = 59 * hash + Objects.hashCode(contentType); +// hash = 59 * hash + Objects.hashCode(contentType); hash = 59 * hash + Objects.hashCode(title); hash = 59 * hash + Objects.hashCode(description); hash = 59 * hash + Objects.hashCode(version); @@ -415,9 +417,9 @@ public class ContentItem extends CcmObject implements Serializable { if (!Objects.equals(name, other.getName())) { return false; } - if (!Objects.equals(contentType, other.getContentType())) { - return false; - } +// if (!Objects.equals(contentType, other.getContentType())) { +// return false; +// } if (!Objects.equals(title, other.getTitle())) { return false; } @@ -445,7 +447,7 @@ public class ContentItem extends CcmObject implements Serializable { public String toString(final String data) { return super.toString(String.format(", itemUuid = %s, " + "name = %s, " - + "contentType = { %s }, " +// + "contentType = { %s }, " + "title = %s, " + "description = %s, " + "version = %s, " @@ -455,7 +457,7 @@ public class ContentItem extends CcmObject implements Serializable { + "%s", itemUuid, Objects.toString(name), - Objects.toString(contentType), +// Objects.toString(contentType), Objects.toString(title), Objects.toString(description), Objects.toString(version), diff --git a/ccm-cms/src/main/java/org/librecms/contentsection/ContentType.java b/ccm-cms/src/main/java/org/librecms/contentsection/ContentType.java index d5f3ebd86..8ccd32037 100644 --- a/ccm-cms/src/main/java/org/librecms/contentsection/ContentType.java +++ b/ccm-cms/src/main/java/org/librecms/contentsection/ContentType.java @@ -37,6 +37,7 @@ import javax.persistence.Embedded; import javax.persistence.Entity; import javax.persistence.EnumType; import javax.persistence.Enumerated; +import javax.persistence.FetchType; import javax.persistence.JoinColumn; import javax.persistence.JoinTable; import javax.persistence.ManyToOne; @@ -76,7 +77,7 @@ public class ContentType extends CcmObject implements Serializable { @Column(name = "CONTENT_ITEM_CLASS", length = 1024) private String contentItemClass; - @ManyToOne + @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "CONTENT_SECTION_ID") private ContentSection contentSection; @@ -110,11 +111,11 @@ public class ContentType extends CcmObject implements Serializable { @Enumerated(EnumType.STRING) private ContentTypeMode mode; - @ManyToOne + @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "DEFAULT_LIFECYCLE_ID") private LifecycleDefinition defaultLifecycle; - @ManyToOne + @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "DEFAULT_WORKFLOW") private WorkflowTemplate defaultWorkflow; 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 55cddedac..f9ba65413 100644 --- a/ccm-cms/src/main/java/org/librecms/contentsection/Folder.java +++ b/ccm-cms/src/main/java/org/librecms/contentsection/Folder.java @@ -24,14 +24,11 @@ import javax.persistence.OneToOne; 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; import java.util.List; import java.util.Objects; -import java.util.Optional; import java.util.stream.Collectors; import javax.persistence.Column; diff --git a/ccm-cms/src/main/resources/org/librecms/CmsResources.properties b/ccm-cms/src/main/resources/org/librecms/CmsResources.properties index 14bdfb568..0209b9054 100644 --- a/ccm-cms/src/main/resources/org/librecms/CmsResources.properties +++ b/ccm-cms/src/main/resources/org/librecms/CmsResources.properties @@ -117,3 +117,4 @@ cms.ui.new_folder=Create new folder cms.ui.edit_folder=Rename the current folder cms.ui.authoring.create_new=Create new cms.ui.authoring.go=Go +empty_text= diff --git a/ccm-cms/src/main/resources/org/librecms/CmsResources_de.properties b/ccm-cms/src/main/resources/org/librecms/CmsResources_de.properties index 3a4b0f0e8..0855fbd0e 100644 --- a/ccm-cms/src/main/resources/org/librecms/CmsResources_de.properties +++ b/ccm-cms/src/main/resources/org/librecms/CmsResources_de.properties @@ -116,3 +116,4 @@ cms.ui.new_folder=Neuen Ordner erstellen cms.ui.edit_folder=Aktuellen Ordner umbenennen cms.ui.authoring.create_new=Neuer Inhalt cms.ui.authoring.go=Anlegen +empty_text= diff --git a/ccm-cms/src/main/resources/org/librecms/CmsResources_fr.properties b/ccm-cms/src/main/resources/org/librecms/CmsResources_fr.properties index 03d9ebc0b..c8ede8383 100644 --- a/ccm-cms/src/main/resources/org/librecms/CmsResources_fr.properties +++ b/ccm-cms/src/main/resources/org/librecms/CmsResources_fr.properties @@ -85,3 +85,4 @@ cms.ui.new_folder=Create new folder cms.ui.edit_folder=Rename the current folder cms.ui.authoring.create_new=Create new cms.ui.authoring.go=Go +empty_text= diff --git a/ccm-core/src/main/java/com/arsdigita/bebop/tree/TreeModel.java b/ccm-core/src/main/java/com/arsdigita/bebop/tree/TreeModel.java index 6819fd144..031a60253 100644 --- a/ccm-core/src/main/java/com/arsdigita/bebop/tree/TreeModel.java +++ b/ccm-core/src/main/java/com/arsdigita/bebop/tree/TreeModel.java @@ -48,5 +48,5 @@ public interface TreeModel { * Check whether a given node has children, passing * in PageState for permissioning purposes */ - Iterator getChildren(TreeNode n, PageState data); + Iterator getChildren(TreeNode n, PageState data); } diff --git a/ccm-core/src/main/java/com/arsdigita/ui/CcmObjectSelectionModel.java b/ccm-core/src/main/java/com/arsdigita/ui/CcmObjectSelectionModel.java index 1ccefb023..26be3fb81 100644 --- a/ccm-core/src/main/java/com/arsdigita/ui/CcmObjectSelectionModel.java +++ b/ccm-core/src/main/java/com/arsdigita/ui/CcmObjectSelectionModel.java @@ -107,7 +107,14 @@ public class CcmObjectSelectionModel @Override public Long getSelectedKey(final PageState state) { - return model.getSelectedKey(state); + final Object key = model.getSelectedKey(state); + if (key instanceof Long) { + return (Long) key; + } else if(key instanceof String) { + return Long.parseLong((String) key); + } else { + return Long.parseLong(key.toString()); + } } @Override diff --git a/ccm-core/src/main/java/org/libreccm/security/RoleMembershipMarshaller.java b/ccm-core/src/main/java/org/libreccm/security/RoleMembershipMarshaller.java index a4bcf549b..d691f3e5e 100644 --- a/ccm-core/src/main/java/org/libreccm/security/RoleMembershipMarshaller.java +++ b/ccm-core/src/main/java/org/libreccm/security/RoleMembershipMarshaller.java @@ -51,10 +51,10 @@ public class RoleMembershipMarshaller extends AbstractMarshaller protected void insertIntoDb(RoleMembership portableObject) { // if (portableObject.getMembershipId() == 0) { -// portableObject.setMembershipId(0); - portableObject.setMembershipId(portableObject.getMembershipId() * -1); -// entityManager.persist(portableObject); - entityManager.merge(portableObject); + portableObject.setMembershipId(0); +// portableObject.setMembershipId(portableObject.getMembershipId() * -1); + entityManager.persist(portableObject); +// entityManager.merge(portableObject); entityManager.flush(); LOGGER.debug("Saved RoleMembership with id {}.", portableObject.getMembershipId());