/* * Copyright (C) 2001-2004 Red Hat Inc. All Rights Reserved. * * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ package com.arsdigita.cms.ui.folder; import com.arsdigita.bebop.BoxPanel; import com.arsdigita.bebop.Component; import com.arsdigita.bebop.Container; import com.arsdigita.bebop.ControlLink; import com.arsdigita.bebop.Form; import com.arsdigita.bebop.FormData; import com.arsdigita.bebop.FormProcessException; import com.arsdigita.bebop.GridPanel; import com.arsdigita.bebop.Label; import com.arsdigita.bebop.Page; import com.arsdigita.bebop.PageState; import com.arsdigita.bebop.PaginationModelBuilder; import com.arsdigita.bebop.Paginator; import com.arsdigita.bebop.RequestLocal; import com.arsdigita.bebop.Resettable; import com.arsdigita.bebop.SaveCancelSection; import com.arsdigita.bebop.SimpleContainer; import com.arsdigita.bebop.Table; import com.arsdigita.bebop.Tree; import com.arsdigita.bebop.event.FormProcessListener; import com.arsdigita.bebop.event.FormSectionEvent; import com.arsdigita.bebop.event.FormSubmissionListener; import com.arsdigita.bebop.event.FormValidationListener; import com.arsdigita.bebop.event.PrintEvent; import com.arsdigita.bebop.event.PrintListener; import com.arsdigita.bebop.form.CheckboxGroup; import com.arsdigita.bebop.form.FormErrorDisplay; import com.arsdigita.bebop.form.Option; import com.arsdigita.bebop.form.OptionGroup; import com.arsdigita.bebop.form.SingleSelect; import com.arsdigita.bebop.form.Submit; import com.arsdigita.bebop.parameters.ArrayParameter; import com.arsdigita.bebop.parameters.BigDecimalParameter; import com.arsdigita.bebop.parameters.StringParameter; import com.arsdigita.bebop.table.TableCellRenderer; import com.arsdigita.bebop.table.TableColumn; import com.arsdigita.bebop.tree.TreeCellRenderer; import com.arsdigita.cms.ContentBundle; import com.arsdigita.cms.ContentItem; import com.arsdigita.cms.ContentSection; import com.arsdigita.cms.Folder; import com.arsdigita.cms.ItemCollection; import com.arsdigita.cms.SecurityManager; import com.arsdigita.cms.dispatcher.Utilities; import com.arsdigita.cms.util.GlobalizationUtil; import com.arsdigita.domain.DataObjectNotFoundException; import com.arsdigita.domain.DomainObjectFactory; import com.arsdigita.globalization.GlobalizedMessage; import com.arsdigita.kernel.ACSObject; import com.arsdigita.kernel.User; import com.arsdigita.persistence.CompoundFilter; import com.arsdigita.persistence.DataCollection; import com.arsdigita.persistence.Filter; import com.arsdigita.persistence.OID; import com.arsdigita.persistence.SessionManager; import com.arsdigita.toolbox.ui.ActionGroup; import com.arsdigita.util.Assert; import com.arsdigita.web.Web; import org.apache.log4j.Logger; import java.math.BigDecimal; import java.util.ArrayList; import java.util.Arrays; /** * Browse folders and manipulate them with various actions * (move/copy/delete). * * @author David Lutterkort * @version $Id: FolderManipulator.java 1940 2009-05-29 07:15:05Z terry $ */ public class FolderManipulator extends SimpleContainer implements FormProcessListener, FormValidationListener, FormSubmissionListener, Resettable { private static Logger s_log = Logger.getLogger(FolderManipulator.class); public static final String RESOURCE_BUNDLE = "com.arsdigita.cms.ui.folder.CMSFolderResources"; private static final String MOVE = "Move"; private static final String COPY = "Copy"; private static final BigDecimal[] EMPTY_ARRAY = new BigDecimal[0]; private ArrayParameter m_sources; private StringParameter m_action; // The folder in which the source items live private FolderSelectionModel m_srcFolderSel; private ItemView m_itemView; private TargetSelector m_targetSelector; public FolderManipulator(FolderSelectionModel folderSel) { m_sources = new ArrayParameter(new BigDecimalParameter("srcs")); m_action = new StringParameter("act"); m_srcFolderSel = folderSel; m_itemView = new ItemView(); m_itemView.addProcessListener(this); m_itemView.addValidationListener(this); add(m_itemView); m_targetSelector = new TargetSelector(); add(m_targetSelector); m_targetSelector.addProcessListener(this); m_targetSelector.addValidationListener(this); m_targetSelector.addSubmissionListener(this); } @Override public void register(Page p) { super.register(p); p.setVisibleDefault(m_targetSelector, false); p.addComponentStateParam(this, m_sources); p.addComponentStateParam(this, m_action); } public final BigDecimal[] getSources(PageState s) { BigDecimal[] result = (BigDecimal[]) s.getValue(m_sources); return (result==null) ? EMPTY_ARRAY : result; } public final FolderSelectionModel getSrcFolderSel () { return m_srcFolderSel; } public final Folder getTarget(PageState s) { return m_targetSelector.getTarget(s); } protected final boolean isMove(PageState s) { return MOVE.equals(getAction(s)); } protected final boolean isCopy(PageState s) { return COPY.equals(getAction(s)); } private String getAction(PageState s) { return (String) s.getValue(m_action); } protected void moveItems(Folder target, BigDecimal[] items) { s_log.debug ("moving to folder: " + target + " items: " + items); for (int i=0; i 0; SecurityManager sm = Utilities.getSecurityManager(s); if ( e.getSource() == m_itemView ) { if ( ! hasSources ) { d.addError(globalize("cms.ui.folder.must_select_item")); } } else if ( e.getSource() == m_targetSelector ) { // The source items must have gotten lost somehow if ( ! hasSources ) { throw new IllegalStateException( (String) GlobalizationUtil.globalize("cms.ui.folder.no_source_items_specified").localize()); } Folder target = m_targetSelector.getTarget(s); if ( target == null ) { d.addError(globalize("cms.ui.folder.need_select_target_folder")); } if ( target.equals(m_srcFolderSel.getSelectedObject(s)) ) { d.addError(globalize("cms.ui.folder.not_within_same_folder")); } // check create item permission User user = Web.getContext().getUser(); if ( ! sm.canAccess(user, SecurityManager.NEW_ITEM, target) ) { d.addError(globalize("cms.ui.folder.no_permission_for_item")); } // Per-item checks for (int i=0; i