From e1b296b5ddd102caa38c73f7d0db53b03aa83947 Mon Sep 17 00:00:00 2001 From: jensp Date: Fri, 3 Mar 2017 14:02:24 +0000 Subject: [PATCH] CCM NG/ccm-cms: Copying items in the FolderBrowser now works git-svn-id: https://svn.libreccm.org/ccm/ccm_ng@4618 8810af33-2d31-482b-a856-94f89814c4df --- .../cms/ui/folder/FolderManipulator.java | 208 +++++++++--------- .../cms/ui/folder/FolderSelectionModel.java | 15 -- .../arsdigita/cms/ui/folder/FolderTree.java | 27 +++ 3 files changed, 134 insertions(+), 116 deletions(-) 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 54411f37b..bbdc630ef 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 @@ -65,7 +65,6 @@ import com.arsdigita.toolbox.ui.ActionGroup; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; -import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -81,11 +80,14 @@ import org.librecms.contentsection.ContentItem; import org.librecms.contentsection.ContentItemManager; import org.librecms.contentsection.ContentItemRepository; import org.librecms.contentsection.Folder; +import org.librecms.contentsection.FolderManager; import org.librecms.contentsection.FolderRepository; import org.librecms.contentsection.privileges.ItemPrivileges; import java.util.Objects; +import static org.librecms.CmsConstants.*; + /** * Browse folders and manipulate them with various actions (move/copy/delete). * @@ -93,14 +95,14 @@ import java.util.Objects; */ @SuppressWarnings("PMD.BeanMembersShouldSerialize") public class FolderManipulator extends SimpleContainer implements - //FormProcessListener, - //FormValidationListener, - //FormSubmissionListener, - Resettable { + //FormProcessListener, + //FormValidationListener, + //FormSubmissionListener, + Resettable { //public static final String RESOURCE_BUNDLE = "com.arsdigita.cms.ui.folder.CMSFolderResources"; private static final Logger LOGGER = LogManager.getLogger( - FolderManipulator.class); + FolderManipulator.class); private static final String ATOZ_FILTER_PARAM = "aToZfilter"; private static final String ACTION_PARAM = "act"; @@ -113,9 +115,9 @@ public class FolderManipulator extends SimpleContainer implements //private static final String UNPUBLISH = "UnPublish"; private final ArrayParameter sourcesParam = new ArrayParameter( - new StringParameter(SOURCES_PARAM)); + new StringParameter(SOURCES_PARAM)); private final StringParameter actionParam - = new StringParameter(ACTION_PARAM); + = new StringParameter(ACTION_PARAM); ; /** * The folder in which the source items live. @@ -127,9 +129,9 @@ public class FolderManipulator extends SimpleContainer implements private FilterForm filterForm; private final StringParameter atozFilterParam = new StringParameter( - ATOZ_FILTER_PARAM); + ATOZ_FILTER_PARAM); private final StringParameter filterParam - = new StringParameter(FILTER_PARAM); + = new StringParameter(FILTER_PARAM); public FolderManipulator(final FolderSelectionModel folderModel) { @@ -143,9 +145,9 @@ public class FolderManipulator extends SimpleContainer implements targetSelector.addProcessListener(new TargetSelectorProcessListener()); targetSelector.addValidationListener( - new TargetSelectorValidationListener()); + new TargetSelectorValidationListener()); targetSelector.addSubmissionListener( - new TargetSelectorSubmissionListener()); + new TargetSelectorSubmissionListener()); add(targetSelector); //publishDialog.addProcessListener(new PublishDialogProcessListener()); @@ -207,7 +209,7 @@ public class FolderManipulator extends SimpleContainer implements final CdiUtil cdiUtil = CdiUtil.createCdiUtil(); final FolderBrowserController controller = cdiUtil.findBean( - FolderBrowserController.class); + FolderBrowserController.class); controller.moveObjects(target, objectIds); } @@ -216,7 +218,7 @@ public class FolderManipulator extends SimpleContainer implements final CdiUtil cdiUtil = CdiUtil.createCdiUtil(); final FolderBrowserController controller = cdiUtil.findBean( - FolderBrowserController.class); + FolderBrowserController.class); controller.copyObjects(target, objectIds); } @@ -391,7 +393,7 @@ public class FolderManipulator extends SimpleContainer implements @Override public void process(final FormSectionEvent event) - throws FormProcessException { + throws FormProcessException { final PageState state = event.getPageState(); @@ -410,7 +412,7 @@ public class FolderManipulator extends SimpleContainer implements @Override public void process(final FormSectionEvent event) throws - FormProcessException { + FormProcessException { final PageState state = event.getPageState(); @@ -466,7 +468,7 @@ public class FolderManipulator extends SimpleContainer implements @Override public void validate(final FormSectionEvent event) throws - FormProcessException { + FormProcessException { final PageState state = event.getPageState(); final FormData data = event.getFormData(); @@ -480,7 +482,7 @@ public class FolderManipulator extends SimpleContainer implements } private class TargetSelectorValidationListener implements - FormValidationListener { + FormValidationListener { public TargetSelectorValidationListener() { //Nothing @@ -488,7 +490,7 @@ public class FolderManipulator extends SimpleContainer implements @Override public void validate(final FormSectionEvent event) throws - FormProcessException { + FormProcessException { final PageState state = event.getPageState(); @@ -500,25 +502,25 @@ public class FolderManipulator extends SimpleContainer implements final FormData data = event.getFormData(); if (target == null) { data.addError(new GlobalizedMessage( - "cms.ui.folder.need_select_target_folder", - CmsConstants.CMS_FOLDER_BUNDLE)); + "cms.ui.folder.need_select_target_folder", + CmsConstants.CMS_FOLDER_BUNDLE)); //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", - CmsConstants.CMS_FOLDER_BUNDLE)); + "cms.ui.folder.not_within_same_folder", + CmsConstants.CMS_FOLDER_BUNDLE)); } // check create item permission final CdiUtil cdiUtil = CdiUtil.createCdiUtil(); final Shiro shiro = cdiUtil.findBean(Shiro.class); final PermissionChecker permissionChecker = cdiUtil.findBean( - PermissionChecker.class); + PermissionChecker.class); if (!permissionChecker.isPermitted( - ItemPrivileges.CREATE_NEW, target)) { + ItemPrivileges.CREATE_NEW, target)) { data.addError("cms.ui.folder.no_permission_for_item", CmsConstants.CMS_FOLDER_BUNDLE); } @@ -540,24 +542,24 @@ public class FolderManipulator extends SimpleContainer implements final CdiUtil cdiUtil = CdiUtil.createCdiUtil(); final FolderRepository folderRepo = cdiUtil.findBean( - FolderRepository.class); + FolderRepository.class); final ContentItemRepository itemRepo = cdiUtil.findBean( - ContentItemRepository.class); + ContentItemRepository.class); final ContentItemManager itemManager = cdiUtil.findBean( - ContentItemManager.class); + ContentItemManager.class); final FolderBrowserController controller = cdiUtil.findBean( - FolderBrowserController.class); + FolderBrowserController.class); final PermissionChecker permissionChecker = cdiUtil.findBean( - PermissionChecker.class); + PermissionChecker.class); final CcmObject object; final String name; - if (objectId.startsWith("folder--")) { + if (objectId.startsWith(FOLDER_BROWSER_KEY_PREFIX_FOLDER)) { final long folderId = Long.parseLong(objectId.substring( - "folder--".length())); + FOLDER_BROWSER_KEY_PREFIX_FOLDER.length())); final Folder folder = folderRepo.findById(folderId).orElseThrow( - () -> new IllegalArgumentException(String.format( - "No folder with id %d in database.", folderId))); + () -> new IllegalArgumentException(String.format( + "No folder with id %d in database.", folderId))); name = folder.getName(); @@ -568,13 +570,13 @@ public class FolderManipulator extends SimpleContainer implements object = folder; - } else if (objectId.startsWith("item--")) { + } else if (objectId.startsWith(FOLDER_BROWSER_KEY_PREFIX_ITEM)) { final long itemId = Long.parseLong(objectId.substring( - "item--".length())); + FOLDER_BROWSER_KEY_PREFIX_ITEM.length())); final ContentItem item = itemRepo.findById(itemId).orElseThrow( - () -> new IllegalArgumentException(String.format( - "No content item with id %d in database.", - itemId))); + () -> new IllegalArgumentException(String.format( + "No content item with id %d in database.", + itemId))); name = item.getDisplayName(); @@ -585,9 +587,11 @@ public class FolderManipulator extends SimpleContainer implements object = item; } else { throw new IllegalArgumentException(String.format( - "Provided objectId '%s' does not start with 'folder--' " - + "or 'item--'.", - objectId)); + "Provided objectId '%s' does not start with '%s' " + + "or '%s'.", + objectId, + FOLDER_BROWSER_KEY_PREFIX_FOLDER, + FOLDER_BROWSER_KEY_PREFIX_ITEM)); } final long count = controller.countObjects(target, name); @@ -599,7 +603,7 @@ public class FolderManipulator extends SimpleContainer implements if (!(permissionChecker.isPermitted( ItemPrivileges.DELETE, object)) - && isMove(state)) { + && isMove(state)) { addErrorMessage(data, "cms.ui.folder.no_permission_for_item", object.getDisplayName()); @@ -628,7 +632,7 @@ public class FolderManipulator extends SimpleContainer implements // } // } private class TargetSelectorSubmissionListener implements - FormSubmissionListener { + FormSubmissionListener { public TargetSelectorSubmissionListener() { //Nothing @@ -636,15 +640,15 @@ public class FolderManipulator extends SimpleContainer implements @Override public void submitted(final FormSectionEvent event) throws - FormProcessException { + 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)); + "cms.ui.folder.cancelled", + CmsConstants.CMS_FOLDER_BUNDLE)); } } @@ -688,25 +692,26 @@ public class FolderManipulator extends SimpleContainer implements final Label label = (Label) event.getTarget(); final int numberOfItems = getSources(state).length; final Category folder = (Category) sourceFolderModel. - getSelectedObject(state); + getSelectedObject(state); final CdiUtil cdiUtil = CdiUtil.createCdiUtil(); final CategoryManager categoryManager = cdiUtil. - findBean(CategoryManager.class); + findBean(CategoryManager.class); if (isMove(state)) { label.setLabel(new GlobalizedMessage( - "cms.ui.folder.move", - CmsConstants.CMS_FOLDER_BUNDLE, - new Object[]{numberOfItems, - categoryManager.getCategoryPath( - folder)})); + "cms.ui.folder.move", + CmsConstants.CMS_FOLDER_BUNDLE, + new Object[]{numberOfItems, + categoryManager.getCategoryPath( + folder)})); } else if (isCopy(state)) { label.setLabel(new GlobalizedMessage( - "cms.ui.folder.copy", - new Object[]{numberOfItems, - categoryManager.getCategoryPath( - folder)})); + "cms.ui.folder.copy", + CMS_BUNDLE, + new Object[]{numberOfItems, + categoryManager.getCategoryPath( + folder)})); } } @@ -729,21 +734,22 @@ public class FolderManipulator extends SimpleContainer implements // Set things up the first time the selector gets visible public void expose(final PageState state) { - final Category folder = (Category) sourceFolderModel. - getSelectedObject( - state); + final Folder folder = sourceFolderModel.getSelectedObject(state); targetModel.clearSelection(state); if (folder != null) { final CdiUtil cdiUtil = CdiUtil.createCdiUtil(); - final ContentItemManager itemManager = cdiUtil.findBean( - ContentItemManager.class); - - //ToDo -// final ItemCollection items = folder.getPathInfo(true); -// while (items.next()) { -// folderTree.expand(items.getID().toString(), state); -// } -// items.close(); + final FolderManager folderManager = cdiUtil.findBean( + FolderManager.class); + if (folder.getParentFolder() == null) { + folderTree.expand(Long.toString(folder.getObjectId()), + state); + } else { + final List parents = folderManager.getParentFolders( + folder); + parents.stream() + .map(parent -> Long.toString(parent.getObjectId())) + .forEach(folderId -> folderTree.expand(folderId, state)); + } } } @@ -833,15 +839,15 @@ public class FolderManipulator extends SimpleContainer implements // folderBrowser.setFilterForm(filterForm); folderBrowser.setFolderManipulator(FolderManipulator.this); paginator = new Paginator( - new FolderBrowserPaginationModelBuilder(folderBrowser), - CMSConfig.getConfig().getFolderBrowseListSize()); + new FolderBrowserPaginationModelBuilder(folderBrowser), + CMSConfig.getConfig().getFolderBrowseListSize()); folderBrowser.setPaginator(paginator); panel.add(paginator); panel.add(folderBrowser); LOGGER.debug("Adding filter form..."); filterForm = new FilterForm(new FolderBrowserFilterFormModelBuilder( - folderBrowser)); + folderBrowser)); FolderManipulator.this.add(filterForm); checkboxGroup = new CheckboxGroup(sourcesParam); @@ -853,19 +859,19 @@ public class FolderManipulator extends SimpleContainer implements group.addAction(container); container.add(new Label(new GlobalizedMessage( - "cms.ui.folder.edit_selection", - CmsConstants.CMS_FOLDER_BUNDLE))); + "cms.ui.folder.edit_selection", + CmsConstants.CMS_FOLDER_BUNDLE))); actionSelect = new SingleSelect(actionParam); actionSelect.addOption( - new Option(COPY, - new Label(new GlobalizedMessage( - "cms.ui.folder.copy.action", - CmsConstants.CMS_FOLDER_BUNDLE)))); + new Option(COPY, + new Label(new GlobalizedMessage( + "cms.ui.folder.copy.action", + CmsConstants.CMS_FOLDER_BUNDLE)))); actionSelect.addOption( - new Option(MOVE, - new Label(new GlobalizedMessage( - "cms.ui.folder.move.action", - CmsConstants.CMS_FOLDER_BUNDLE)))); + new Option(MOVE, + new Label(new GlobalizedMessage( + "cms.ui.folder.move.action", + CmsConstants.CMS_FOLDER_BUNDLE)))); //Publishing in the folder browser only works if threaded publishing is active // if (CMSConfig.getInstanceOf().getThreadedPublishing()) { // actionSelect.addOption(new Option(PUBLISH, @@ -878,8 +884,8 @@ public class FolderManipulator extends SimpleContainer implements container.add(actionSelect); submit = new Submit("Go", new GlobalizedMessage( - "cms.ui.folder.go", - CmsConstants.CMS_FOLDER_BUNDLE)); + "cms.ui.folder.go", + CmsConstants.CMS_FOLDER_BUNDLE)); container.add(submit); // Add a new first column to the table @@ -957,8 +963,8 @@ public class FolderManipulator extends SimpleContainer implements panel = new BoxPanel(BoxPanel.HORIZONTAL); final ActionLink allLink = new ActionLink( - new GlobalizedMessage("cms.ui.folder.filter.all", - CmsConstants.CMS_FOLDER_BUNDLE)); + new GlobalizedMessage("cms.ui.folder.filter.all", + CmsConstants.CMS_FOLDER_BUNDLE)); allLink.addActionListener(new ActionListener() { @Override @@ -984,14 +990,14 @@ public class FolderManipulator extends SimpleContainer implements // panel.add(link); // } panel.add(new Label(new GlobalizedMessage( - "cms.ui.folder.filter", - CmsConstants.CMS_FOLDER_BUNDLE))); + "cms.ui.folder.filter", + CmsConstants.CMS_FOLDER_BUNDLE))); filterField = new TextField(filterParam); panel.add(filterField); panel.add(new Submit("filterFolderSubmit", new GlobalizedMessage( - "cms.ui.folder.filter_do", - CmsConstants.CMS_FOLDER_BUNDLE))); + "cms.ui.folder.filter_do", + CmsConstants.CMS_FOLDER_BUNDLE))); add(panel); @@ -1003,28 +1009,28 @@ public class FolderManipulator extends SimpleContainer implements @Override public void process(final FormSectionEvent event) throws - FormProcessException { + FormProcessException { //Nothing } @Override public void init(final FormSectionEvent event) throws - FormProcessException { + FormProcessException { //fse.getPageState().setValue(FolderManipulator.this.m_filter, null); //filterField.setValue(fse.getPageState(), null); } @Override public void submitted(final FormSectionEvent event) throws - FormProcessException { + FormProcessException { } @Override public boolean isVisible(PageState state) { if (super.isVisible(state) - && (modelBuilder.getFolderSize(state) - >= CMSConfig.getConfig(). - getFolderAtoZShowLimit())) { + && (modelBuilder.getFolderSize(state) + >= CMSConfig.getConfig(). + getFolderAtoZShowLimit())) { return true; } else { return false; @@ -1056,7 +1062,7 @@ public class FolderManipulator extends SimpleContainer implements private class FolderTreeCellRenderer implements TreeCellRenderer { private final RequestLocal invalidFoldersRequestLocal - = new RequestLocal(); + = new RequestLocal(); /** * Render the folders appropriately. The selected folder is a bold @@ -1078,13 +1084,13 @@ public class FolderManipulator extends SimpleContainer implements if (invalidFoldersRequestLocal.get(state) == null) { final CdiUtil cdiUtil = CdiUtil.createCdiUtil(); final FolderBrowserController controller = cdiUtil.findBean( - FolderBrowserController.class); + FolderBrowserController.class); invalidFolders = controller.createInvalidTargetsList( - Arrays.asList(getSources(state))); + Arrays.asList(getSources(state))); invalidFoldersRequestLocal.set(state, invalidFolders); } else { invalidFolders = (List) invalidFoldersRequestLocal - .get(state); + .get(state); } final Label label = new Label(value.toString()); diff --git a/ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/FolderSelectionModel.java b/ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/FolderSelectionModel.java index 4980bb824..3d906ea45 100755 --- a/ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/FolderSelectionModel.java +++ b/ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/FolderSelectionModel.java @@ -25,7 +25,6 @@ import com.arsdigita.cms.CMS; import com.arsdigita.ui.CcmObjectSelectionModel; import org.libreccm.categorization.Category; -import org.librecms.CmsConstants; import org.librecms.contentsection.ContentSection; import org.librecms.contentsection.Folder; @@ -63,20 +62,6 @@ public class FolderSelectionModel extends CcmObjectSelectionModel { super.setSelectedKey(state, key); } - public void setSelectedKey(final PageState state, final String key) { - if (!key.startsWith(CmsConstants.FOLDER_BROWSER_KEY_PREFIX_FOLDER)) { - throw new IllegalArgumentException(String.format( - "The string '%s' does not contain a folder id " - + "(it does not start with '%s').", - key, - CmsConstants.FOLDER_BROWSER_KEY_PREFIX_FOLDER)); - } - - final long keyAsLong = Long.parseLong(key.substring( - CmsConstants.FOLDER_BROWSER_KEY_PREFIX_FOLDER.length())); - setSelectedKey(state, keyAsLong); - } - /** * Clear the selection by resetting it to the root folder id. * diff --git a/ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/FolderTree.java b/ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/FolderTree.java index f484a9454..829f0f735 100755 --- a/ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/FolderTree.java +++ b/ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/FolderTree.java @@ -18,8 +18,13 @@ */ package com.arsdigita.cms.ui.folder; +import com.arsdigita.bebop.PageState; import com.arsdigita.bebop.Tree; +import org.librecms.CmsConstants; + +import static org.librecms.CmsConstants.*; + public class FolderTree extends Tree { public FolderTree(final FolderSelectionModel folderSel) { @@ -27,4 +32,26 @@ public class FolderTree extends Tree { setSelectionModel(folderSel); } + @Override + public void setSelectedKey(final PageState state, final Object key) { + if (key instanceof String) { + final Long keyAsLong; + if (((String) key).startsWith( + FOLDER_BROWSER_KEY_PREFIX_FOLDER)) { + keyAsLong = Long.parseLong(((String) key).substring( + FOLDER_BROWSER_KEY_PREFIX_FOLDER.length())); + } else { + keyAsLong = Long.parseLong((String) key); + } + super.setSelectedKey(state, keyAsLong); + } else if (key instanceof Long) { + super.setSelectedKey(state, key); + } else { + //We now that a FolderSelectionModel only takes keys of type Long. + //Therefore we try to cast here + final Long keyAsLong = (Long) key; + super.setSelectedKey(state, keyAsLong); + } + } + }